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包的:
unzip(String zipFilePath, String destDirectory)

下面添加一个测试类 UnzipUtilityTest.java
/**
 * 一个控制台应用来测试 UnzipUtility 类
 *
 */
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();
		}
	}

}



你可能感兴趣的:(Java)