Java API 压缩与解压缩之二 使用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对象:

    ZipFile zipfile = new ZipFile("figs.zip"); 
  2. 使用entries方法,返回一个枚举对象,循环获得文件的ZIP条目对象:

    while(e.hasMoreElements()) { 
        entry = (ZipEntry) e.nextElement(); 
        // read contents and save them 
    }
  3. ZIP条目作为参数传递给getInputStream方法,可以读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象可以方便的读出ZIP条目的内容:

    is = new BufferedInputStream(zipfile.getInputStream(entry)); 
  4. 获取ZIP条目的文件名,创建输出流,并保存:

    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); 
    } 
  5. 最后关闭所有的输入输出流

    dest.flush(); 
    dest.close(); 
    is.close(); 


完整代码:

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;
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值