前一阵做东西的时候需要一个解zip的实现,开始只知道ant包的zip子包实现了对中文路径名的支持,感觉其他应该和util包中的zip子包没什么区别,但真写起来还是有点别扭的,毕竟它没有提供ZipInputStream类,因此只好用getEtries获得枚举类型的实体集,它的缺点就在于其破坏了实体间的级联关系,因此处理起来没有util.zip包方便了。
代码有点东拼西凑的成分,就算是转贴吧,呵呵!!!
import java.io.*;
import java.util.*;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
public class Unzip ...{
//zipFileName为需要解压的zip文件,extPlace为解压后文件的存放路径,两者均须已经存在
public static void extZipFileList(String zipFileName, String extPlace) throws
Exception ...{
ZipFile zipFile = new ZipFile(zipFileName);
Enumeration e = zipFile.getEntries();
ZipEntry zipEntry = null;
while (e.hasMoreElements()) ...{
zipEntry = (ZipEntry) e.nextElement();
String entryName = zipEntry.getName();
String names[] = entryName.split("/");
int length = names.length;
String path = extPlace;
for (int v = 0; v < length; v++) ...{
if (v < length - 1) ...{
path += names[v] + "/";
new File(path).mkdir();
}
else ...{ // 最后一个
if (entryName.endsWith("/")) ...{ // 为目录,则创建文件夹
new File(extPlace + entryName).mkdir();
}
else ...{
InputStream in = zipFile.getInputStream(zipEntry);
OutputStream os = new FileOutputStream(new File(extPlace +
entryName));
byte[] buf = new byte[1024];
int len;
while ( (len = in.read(buf)) > 0) ...{
os.write(buf, 0, len);
}
in.close();
os.close();
}
}
}
}
zipFile.close();
}
}