使用Java解压zip格式压缩包
程序员文章站
2022-03-23 22:47:38
使用java解压zip格式压缩包Maven引用使用了apache的 ZipArchiveEntry 和 FileUtils ,具体的maven引用如下(版本按需指定) org.apache.commons
Maven引用
使用了apache的 ZipArchiveEntry 和 FileUtils ,具体的maven引用如下(版本按需指定)
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
代码
/**
* 解压压缩包
*
* @param zipPath 压缩包路径 example:E:\file\test.zip
* @param unZipPath 解压路径 example:E:\file\test\
*/
public static void unZip(String zipPath, String unZipPath) {
// apache commons-compress 获取压缩文件流
try (ZipArchiveInputStream inputStream = new ZipArchiveInputStream(new FileInputStream(zipPath))) {
// 定义entry对象
ZipArchiveEntry entry;
// 循环压缩文件流
while ((entry = inputStream.getNextZipEntry()) != null) {
// 获取文件对象
File file = new File(unZipPath + entry.getName());
// 判断是否为文件夹
if (entry.isDirectory()) {
// 创建解压路径文件夹
FileUtils.forceMkdir(file);
continue;
}
// 生成对应文件
FileUtils.copyToFile(inputStream, file);
}
} catch (IOException e) {
e.printStackTrace();
}
}
说明
- 使用try-resource方式创建ZipArchiveInputStream对象,会在执行之后自动调用close()方法,ZipArchiveInputStream重写了close()方法,调用时会关闭对应的FileInputStream,所以不需要再显示关闭流。
- 循环获取文件对象时,要注意判断当前entry是否为文件夹,代码中调用了FileUtils.forceMkdir(file)处理此情况,此方法中调用了File类下的mkdirs()方法,会自动创建不存在的父级文件夹,避免了因不同压缩工具生成压缩包导致的解压时父级文件夹不存在,需显示判断再创建的问题。
- 循环获取文件对象时,若当前entry是文件,则调用FileUtils.copyToFile(inputStream, file)方法,将文件写入指定目录下。
此方法会自动创建文件夹,所以不需要先创建unZipPath对应文件夹。
一般来说,此方法会将整个输入流写入文件,但是当前场景下,输入流是PushbackInputStream类型(在ZipArchiveInputStream构造器中指定),重写了read()方法,每次复制的都是输入流中当前entry文件对应的位置,所以while循环中每次复制文件使用的输入流其实是同一个对象,因此copyToFile()方法不能用copyInputStreamToFile()方法代替(此方法每次执行完都会关闭输入流,导致下次循环无法获取数据)
本文地址:https://blog.csdn.net/Javauthor/article/details/109642148