文档章节

使用ZipFile解压缩Zip文档

今日竹石
 今日竹石
发布于 2014/03/29 13:47
字数 716
阅读 80
收藏 0

类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. }  

 


© 著作权归作者所有

下一篇: 编程经验
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
私信 提问
无纸化办公博客系列-文件打包

package com.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou......

问题达人
2016/05/10
5
0
Python ZipFile模块详解

Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要...

Betty__
2016/10/09
23
0
Python zipfile模块

Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要...

writeademo
2016/07/27
5
0
java实现文件的压缩和解压缩

压缩: package com.sichang.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im......

别寒
2014/08/26
0
0
PhalApi-Zip--压缩文件处理类

PhalApi-Zip -- 压缩文件处理类 前言 这是笔者在工作中,同事找到的一个比较不错的文件压缩类,也经过了实际的使用很不错所以分享处理,特此鸣谢:@牧鱼人 附上: 官网地址:http://www.phalapi.n...

喵了_个咪
2016/03/13
45
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider
26分钟前
1
0
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤
30分钟前
2
0
关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区
38分钟前
3
0
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg
44分钟前
26
0
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部