类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,因此没必要顺序的读出ZIP压缩文件序列。
ZipInputStream和ZipFile之间另一个基本的不一样点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,若是使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,因此若是ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开时使用。若是你工做在UNIX系统下,这是什么做用都没有的,由于使用ZipFile打开的全部ZIP文件都在内存中存在映射,因此使用ZipFile的性能优于ZipInputStream。然而,若是同一ZIP文件的内容在程序执行期间常常改变,或是重载的话,使用ZipInputStream就成为你的首选了。
下面显示了使用类ZipFile来解压一个ZIP文件的过程:性能
经过指定一个被读取的ZIP文件,或者是文件名,或者是一个文件对象来建立一个ZipFile对象:spa
Java代码 对象
ZipFile zipfile = new ZipFile("figs.zip"); ip
使用entries方法,返回一个枚举对象,循环得到文件的ZIP条目对象:内存
Java代码 get
while(e.hasMoreElements()) { it
entry = (ZipEntry) e.nextElement(); io
// read contents and save them class
} test
ZIP条目做为参数传递给getInputStream方法,能够读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象能够方便的读出ZIP条目的内容:
Java代码
is = new BufferedInputStream(zipfile.getInputStream(entry));
获取ZIP条目的文件名,建立输出流,并保存:
Java代码
byte data[] = new byte[BUFFER];
FileOutputStream fos = new FileOutputStream(entry.getName());
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
最后关闭全部的输入输出流
Java代码
dest.flush();
dest.close();
is.close();
完整代码:
Java代码
public class UnZip2 {
static final int BUFFER = 2048;
public static void main(String argv[]) {
String fileName = "c:/testlog.zip";
String unZipDir = "c:/2/2/";
unZip(fileName, unZipDir);
}
public static void unZip(String fileName, String unZipDir) {
try {
// 先判断目标文件夹是否存在,若是不存在则新建,若是父目录不存在也新建
File f = new File(unZipDir);
if (!f.exists()) {
f.mkdirs();
}
BufferedOutputStream dest = null;
BufferedInputStream is = null;
ZipEntry entry;
ZipFile zipfile = new ZipFile(fileName);
Enumeration e = zipfile.entries();
while (e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
System.out.println("Extracting: " + entry);
is = new BufferedInputStream(zipfile.getInputStream(entry));
int count;
byte data[] = new byte[BUFFER];
FileOutputStream fos = new FileOutputStream(unZipDir + "/"
+ entry.getName());
System.out.println("entry.getName(): " + entry.getName());
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean makeDir(String unZipDir) {
boolean b = false;
try {
File f = new File(unZipDir);
if (!f.exists()) {
b = f.mkdirs();
}
} catch (Exception e) {
e.printStackTrace();
return b;
}
return b;
}
}