使用ZipFile解压缩Zip文档

类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,所以不必顺序的读出ZIP压缩文件序列。
   
ZipInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,如果使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,所以如果ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开时使用。如果你工作在UNIX系统下,这是什么作用都没有的,因为使用ZipFile打开的所有ZIP文件都在内存中存在映射,所以使用ZipFile的性能优于ZipInputStream。然而,如果同一ZIP文件的内容在程序执行期间经常改变,或是重载的话,使用ZipInputStream就成为你的首选了。

    下面显示了使用类ZipFile来解压一个ZIP文件的过程:

  1. 通过指定一个被读取的ZIP文件,或者是文件名,或者是一个文件对象来创建一个ZipFile对象:

    Java代码  

    1. ZipFile zipfile = new ZipFile("figs.zip");   

  2. 使用entries方法,返回一个枚举对象,循环获得文件的ZIP条目对象:

    Java代码  

    1. while(e.hasMoreElements()) {   

    2.     entry = (ZipEntry) e.nextElement();   

    3.     // read contents and save them   

    4. }  

  3. ZIP条目作为参数传递给getInputStream方法,可以读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象可以方便的读出ZIP条目的内容:

    Java代码  

    1. is = new BufferedInputStream(zipfile.getInputStream(entry));   

  4. 获取ZIP条目的文件名,创建输出流,并保存:

    Java代码  

    1. byte data[] = new byte[BUFFER];   

    2. FileOutputStream fos = new FileOutputStream(entry.getName());   

    3. dest = new BufferedOutputStream(fos, BUFFER);   

    4. while ((count = is.read(data, 0, BUFFER)) != -1) {   

    5.     dest.write(data, 0, count);   

    6. }   

  5. 最后关闭所有的输入输出流

    Java代码  

    1. dest.flush();   

    2. dest.close();   

    3. is.close();   


完整代码:

Java代码  

  1. public class UnZip2 {  

  2.     static final int BUFFER = 2048;  

  3.     public static void main(String argv[]) {  

  4.         String fileName = "c:/testlog.zip";  

  5.         String unZipDir = "c:/2/2/";  

  6.         unZip(fileName, unZipDir);  

  7.     }  

  8.   

  9.     public static void unZip(String fileName, String unZipDir) {  

  10.   

  11.         try {  

  12.             // 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建  

  13.             File f = new File(unZipDir);  

  14.             if (!f.exists()) {  

  15.                 f.mkdirs();  

  16.             }  

  17.   

  18.             BufferedOutputStream dest = null;  

  19.             BufferedInputStream is = null;  

  20.             ZipEntry entry;  

  21.             ZipFile zipfile = new ZipFile(fileName);  

  22.             Enumeration e = zipfile.entries();  

  23.             while (e.hasMoreElements()) {  

  24.                 entry = (ZipEntry) e.nextElement();  

  25.                 System.out.println("Extracting: " + entry);  

  26.                 is = new BufferedInputStream(zipfile.getInputStream(entry));  

  27.                 int count;  

  28.                 byte data[] = new byte[BUFFER];  

  29.                 FileOutputStream fos = new FileOutputStream(unZipDir + "/"  

  30.                         + entry.getName());  

  31.                 System.out.println("entry.getName(): " + entry.getName());  

  32.                 dest = new BufferedOutputStream(fos, BUFFER);  

  33.                 while ((count = is.read(data, 0, BUFFER)) != -1) {  

  34.                     dest.write(data, 0, count);  

  35.                 }  

  36.                 dest.flush();  

  37.                 dest.close();  

  38.                 is.close();  

  39.             }  

  40.         } catch (Exception e) {  

  41.             e.printStackTrace();  

  42.         }  

  43.     }  

  44.   

  45.     public static boolean makeDir(String unZipDir) {  

  46.         boolean b = false;  

  47.         try {  

  48.             File f = new File(unZipDir);  

  49.             if (!f.exists()) {  

  50.                 b = f.mkdirs();  

  51.             }  

  52.         } catch (Exception e) {  

  53.             e.printStackTrace();  

  54.             return b;  

  55.         }  

  56.         return b;  

  57.     }  

  58. }  

 


你可能感兴趣的:(使用ZipFile解压缩Zip文档)