Java实现解压ZIP文件

一、概述

这篇文章主要是关于怎样写一个解压Zip包的工具类,使用的是Java内置的接口。
java.util.zip 包提供了下面的一些类来解压Zip包:
ZipInputStream :
这个是读取和解压Zip压缩包的核心类,这里有一些该类重要的用法:
1. 通过构造器读取Zip包 ZipInputStream(FileInputStream)
2. 读取的文件和目录的条目 getNextEntry()
3. 读取当前条目的二进制数据   read(byte)
4. 关闭当前条目 closeEntry()
5. 关闭Zip压缩包 close()
ZipEntry :
这个类表示Zip包中的一个条目,每一个Zip包中的文件或者目录都被表示为一个ZipEntry对象。
其中的GetName()将返回一个文件或者目录的路径的字符串。
基于ZipEntry的路径,当我们解压Zip包的时候就可以重构它的目录结构。
另外,BufferedOutputStream类被用来将当前ZipEntry的内容写到你的磁盘文件中,通过write(byte[] bytes, int offset, int length)方法。


二、源码详解


以下是UnzipUtility.java的源码:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * 本工具类解压标准的Zip包到指定目录中
 */
public class UnzipUtility {
	/**
	 * 读/写数据时缓冲区大小
	 */
	private static final int BUFFER_SIZE = 4096;

	/**
	 * 解压有zipFilePath所指定的Zip文件到destDirectory所指定的目录(如果目标目录不存在将会重新创建)
	 * 
	 * @param zipFilePath
	 * @param destDirectory
	 * @throws IOException
	 */
	public void unzip(String zipFilePath, String destDirectory) throws IOException {
		File destDir = new File(destDirectory);
		if (!destDir.exists()) {
			destDir.mkdir();
		}

		ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));

		ZipEntry entry = zipIn.getNextEntry();

		// 遍历Zip文件中的条目
		while (entry != null) {
			String filePath = destDirectory + File.separator + entry.getName();
			if (!entry.isDirectory()) {
				// 如果条目是文件直接解压
				extractFile(zipIn, filePath);
			} else {
				// 如果条目是目录, 创建对应的目录
				File dir = new File(filePath);
				dir.mkdir();
			}
			zipIn.closeEntry();
			entry = zipIn.getNextEntry();
		}
		zipIn.close();
	}

	/**
	 * 解压Zip包的条目 (文件条目)
	 * @param zipIn
	 * @param filePath
	 * @throws IOException
	 */
	private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
		byte[] bytesIn = new byte[BUFFER_SIZE];
		int read = 0;
		while ((read = zipIn.read(bytesIn)) != -1) {
			bos.write(bytesIn, 0, read);
		}
		bos.close();
	}
}
可以看到 UnzipUtility.java中提供了一个公有的方法用来解压Zip包的:
<span style="font-family:Times New Roman;">unzip(String zipFilePath, String destDirectory)</span>

下面添加一个测试类 UnzipUtilityTest.java
/**
 * 一个控制台应用来测试 UnzipUtility 类
 *
 */
<span style="font-family:Times New Roman;">public class UnzipUtilityTest {

	public static void main(String[] args) {
		String zipFilePath = "e:/Test/MyPics.zip";
		String destDirectory = "f:/Pics";
		UnzipUtility unzipper = new UnzipUtility();

		try {
			unzipper.unzip(zipFilePath, destDirectory);
		} catch (Exception ex) {
			// 一些错误的产生
			ex.printStackTrace();
		}
	}

}</span>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值