使用Java解压zip格式压缩包

Maven引用

使用了apache的 ZipArchiveEntryFileUtils ,具体的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();
  }
}

说明

  1. 使用try-resource方式创建ZipArchiveInputStream对象,会在执行之后自动调用close()方法,ZipArchiveInputStream重写了close()方法,调用时会关闭对应的FileInputStream,所以不需要再显示关闭流。
  2. 循环获取文件对象时,要注意判断当前entry是否为文件夹,代码中调用了FileUtils.forceMkdir(file)处理此情况,此方法中调用了File类下的mkdirs()方法,会自动创建不存在的父级文件夹,避免了因不同压缩工具生成压缩包导致的解压时父级文件夹不存在,需显示判断再创建的问题。
  3. 循环获取文件对象时,若当前entry是文件,则调用FileUtils.copyToFile(inputStream, file)方法,将文件写入指定目录下。
    此方法会自动创建文件夹,所以不需要先创建unZipPath对应文件夹。
    一般来说,此方法会将整个输入流写入文件,但是当前场景下,输入流是PushbackInputStream类型(在ZipArchiveInputStream构造器中指定),重写了read()方法,每次复制的都是输入流中当前entry文件对应的位置,所以while循环中每次复制文件使用的输入流其实是同一个对象,因此copyToFile()方法不能用copyInputStreamToFile()方法代替(此方法每次执行完都会关闭输入流,导致下次循环无法获取数据)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值