答案: 在java中专门有一个对zip文件操作的包(java.util.zip),对zip文件操作挺方便的,上次说写一个zip文件释放程序,花了一天时间终于写完了,起先想起来挺简单的:原理就是将zip文件中的文件夹和文件通过ZipInputStream和ZipEntry类一一得出,然后分别再对应目录下创建文件和文件夹。可是实现起来就不是那么回事了,其中有好多细节问题都不好解决,其中在调用ZipInputStream中的getNextEntry方法时如果zip文件中包含中文路径名或者文件名就会抛出异常,所以这段程序难免会有许多错误和bug,甚至还有些思路上的问题,希望大家能多提意见。
其实java中对文件的操作就是对输入输出流的运用和控制,这样讲有些范,但是如果你理解了流的运用就会觉得对文件操作原来就是这样呀!但是你千万不要以为java的输入输出就这么简单,会用和用的好是两码事,就象同样形容思想坚决,果断和武断就是两个截然不同的描述,因此要想用好java的出入输出还需要多多练习,多多思考。好了,说了那么多都是些废话,下面是程序源码,希望对大家有用!pcera
2005-7-2 17:44
/**
*类名:zipFileRelease
*说明:对zip文件解压,释放在指定,目录下
*介绍:主要的zip文件释放方法releaseHandle()
* 用ZipInputStream类和ZipEntry类将zip文件的入口清单列举出来,然后
* 根据用户提供的输出路径和zip文件的入口进行组合通过DataOutputStream
* 和File类进行文件的创建和目录的创建,创建文件时的文件数据是通过
* ZipInputStream类、ZipEntry类、InputStream类之间的套嵌组合获得的。
*注意:如果zip文件中包含中文路径程序将会抛出异常
*日期:2005-7-1
*作者:Pcera
*/import java.io.*;
import java.util.*;
import java.util.zip.*;class zipFileRelease{
private String inFilePath;
private String releaseFilePath;
private String[] FileNameArray; //存放文件名称的数组
private ZipEntry entry;
//
private FileInputStream fileDataIn;
private FileOutputStream fileDataOut;
private ZipInputStream zipInFile;
private DataOutputStream writeData;
private DataInputStream readData;
//
private int zipFileCount = 0; //zip文件中的文件总数
private int zipPathCount = 0; //zip文件中的路径总数
/**
*初始化函数
*初始化zip文件流、输出文件流以及其他变量的初始化
*/
public zipFileRelease(String inpath,String releasepath){
inFilePath = inpath;
releaseFilePath = releasepath;
}
/**
*初始化读取文件流函数
*参数:FileInputStream类
*返回值:初始化成功返回0,否则返回-1
*/
protected long initInStream(ZipInputStream zipFileA){
try{
readData = new DataInputStream(zipFileA);
return 0;
}catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
*测试文件路径
*参数:zip文件的路径和要释放的位置
*返回值:是两位整数,两位数中的十位代表输入路径和输出路径(1输入、2输出)
* 各位数是代表绝对路径还是相对路径(1绝对、0相对)
* 返回-1表示路径无效
protected long checkPath(String inPath,String outPath){
File infile = new File(inPath);
File infile = new File(outPath);
}
*/
/**
*初始化输出文件流
*参数:File类
*返回值:初始化成功返回0,否则返回-1
*/
protected long initOutStream(String outFileA){
try{
fileDataOut = new FileOutputStream(outFileA);
writeData = new DataOutputStream(fileDataOut);
return 0;
}catch(IOException e){
e.printStackTrace();
return -1;
}
}
/**
*测试文件是否存在方法
*参数:File类
*返回值:如果文件存在返回文件大小,否则返回-1
*/
public long checkFile(File inFileA){
if (inFileA.exists()){
return 0;
}else{
return -1;
}
}
/**
*判断文件是否可以读取方法
*参数:File类
*返回值:如果可以读取返回0,否则返回-1
*/
public long checkOpen(File inFileA){
if(inFileA.canRead()){
return inFileA.length();
}else{
return -1;
}
}
/**
*获得zip文件中的文件夹和文件总数
*参数:File类
*返回值:如果正常获得则返回总数,否则返回-1
*/
public long getFilFoldCount(String infileA){
try{
int fileCount = 0;
zipInFile = new ZipInputStream(
new FileInputStream(infileA));
while ((entry = zipInFile.getNextEntry()) != null){
if (entry.isDirectory()){
zipPathCount++;
}else{
zipFileCount++;
}
fileCount++;
}
return fileCount;
}catch(IOException e){
&nb