一、概述
这篇文章主要是关于怎样写一个解压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的源码:可以看到 UnzipUtility.java中提供了一个公有的方法用来解压Zip包的: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(); } }
<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>