欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Java解压zip格式压缩包

程序员文章站 2022-03-23 22:47:38
使用java解压zip格式压缩包Maven引用使用了apache的 ZipArchiveEntry 和 FileUtils ,具体的maven引用如下(版本按需指定) org.apache.commons

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()方法代替(此方法每次执行完都会关闭输入流,导致下次循环无法获取数据)

本文地址:https://blog.csdn.net/Javauthor/article/details/109642148

相关标签: java zip