当前位置: 首页 > 编程笔记 >

如何基于java实现解压ZIP TAR等文件

魏俊茂
2023-03-14
本文向大家介绍如何基于java实现解压ZIP TAR等文件,包括了如何基于java实现解压ZIP TAR等文件的使用技巧和注意事项,需要的朋友参考一下

  java实现对常用.ZIP , .TAR, .TAR.BZ2, .BZ2 ,.TAR.GZ ,.GZ格式文件的解压。

  首先需要引入maven依赖,这里使用的是Apache的压缩工具包common-compress,改工具包支持解压、压缩,此代码中我列举出一个zip的压缩示例,其他格式的只需切换改格式对应的流即可。

对于RAR格式文件的解压,目前该工具包还不支持,希望大家做过的可以多多交流。

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-compress</artifactId>
  <version>1.19</version></dependency>
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;

/**
 * @author :zhangzhiyong
 * @description:  java实现常见文件格式的解压与压缩
 *         支持.ZIP .TAR .TAR.BZ2 .BZ2 .TAR.GZ .GZ
 *         其他格式compress包也支持,在此基础上开发即可
 *         另外压缩文件只写了ZIP压缩的方法zipCompression,其他的格式类似,换成对应的文件流即可。
 *   暂不支持RAR压缩格式,RAR可以用junrar的工具包,但是有缺陷:
 *   其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;
 *   其二:最新 WinRar 压缩产生的 .rar 文件可能会无法解压。
 *   缺陷原因:rar 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。
 * @date :2020/7/1 20:44
 */
public class CompressionFileUtil {
  /**
   * @param filePath 需要解压的zip文件的完成路径。
   * @param unzipPath 解压过后生成文件的存放路径
   * @description: 对zip文件进行解压。
   * @return: boolean
   * @author: ZZY
   * @time: 2020/7/2 14:47
   */
  public static boolean zipUnCompress(String filePath, String unzipPath) throws IOException {

    System.out.println("开始解压ZIP..........");
    FileInputStream fis = null;
    ZipArchiveInputStream zis = null;
    try {
      File file = new File(filePath);
      fis = new FileInputStream(file);
      zis = new ZipArchiveInputStream(fis);
      ZipArchiveEntry nze = null;
      while ((nze = zis.getNextZipEntry()) != null) {
        FileOutputStream os = null;
        BufferedOutputStream bos = null;
        try {
          System.out.println("正在解压....." + nze.getName());
          //自动添加File.separator文件路径的分隔符,根据系统判断是\\还是/
          String dir = unzipPath + File.separator + nze.getName(); //解压全路径
          System.out.println("dir---" + dir);
          File file1 = null;
          if (nze.isDirectory()) {
            file1 = new File(dir);
            file1.mkdirs();
          } else {
            file1 = new File(dir);
            os = new FileOutputStream(file1);
            bos = new BufferedOutputStream(os);
             /*byte [] bt = new byte[1024];
             int len = 0;
             while((len = zis.read(bt,0,1024)) != -1){
               bos.write(bt,0,len);
             }*/
            IOUtils.copy(zis, bos); //作用与上面注释代码一样
          }
          System.out.println("解压完成......");
        } catch (FileNotFoundException e) {
          e.printStackTrace();
          return false;
        } finally {
          if (bos != null) {
            bos.close();
          }
          if (os != null) {
            os.close();
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    } finally {
      if (zis != null) {
        zis.close();
      }
      if (fis != null) {
        fis.close();
      }
    }
    return true;
  }

  /**
   * @param filesPathArray 多个文件的绝对路径,是一个数组。
   * @param zipFilePath  生成的压缩文件的位置,包括生成的文件名,如D:\zip\test.zip
   * @description: 将多个文件压缩成ZIP压缩包。
   * @return: boolean
   * @author: ZZY
   * @time: 2020/7/2 14:42
   */
  public static boolean zipCompression(String[] filesPathArray, String zipFilePath) throws Exception {
    System.out.println("开始压缩ZIP文件");
    ZipArchiveOutputStream zos = null;
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(new File(zipFilePath));
      zos = new ZipArchiveOutputStream(fos);
      for (String filePath : filesPathArray) {
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        try {
          File file = new File(filePath);
          // 第二个参数如果是文件全路径名,那么压缩时也会将路径文件夹也缩进去;
          // 我们只压缩目标文件,而不压缩该文件所处位置的相关文件夹,所以这里我们用file.getName()
          System.out.println("开始压缩..." + file.getName());
          ZipArchiveEntry zae = new ZipArchiveEntry(file, file.getName());
          zos.putArchiveEntry(zae);
          fis = new FileInputStream(file);
          bis = new BufferedInputStream(fis);
          int count;
          byte[] bt = new byte[1024];
          while ((count = bis.read(bt, 0, 1024)) != -1) {
            zos.write(bt, 0, count);
          }
        } finally {
          zos.closeArchiveEntry();
          if (bis != null)
            bis.close();
          if (fis != null)
            fis.close();
        }
      }
    } finally {
      if (zos != null)
        zos.close();
      if (fos != null)
        fos.close();
    }
    System.out.println("压缩完成......");
    return true;
  }

  /**
   * @param inputStream 每种TAR文件用不同的输入流,unCompress方法中已注明
   * @param unTarPath  TAR文件解压后的存放路径
   * @description: 解压TAR类文件,包括.TAR .TAR.BZ2 .TAR.GZ
   * @return: void
   * @author: ZZY
   * @time: 2020/7/2 17:42
   */
  public static void unTar(InputStream inputStream, String unTarPath) throws IOException {

    FileInputStream fis = null;
    TarArchiveInputStream tis = null;
    try {
      tis = new TarArchiveInputStream(inputStream);
      TarArchiveEntry nte = null;
      System.out.println("开始解压......");
      while ((nte = tis.getNextTarEntry()) != null) {
        String dir = unTarPath + File.separator + nte.getName();
        System.out.println("正在解压......" + dir);
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
          if (nte.isDirectory()) {
            File file1 = new File(dir);
            file1.mkdirs();
          } else {
            File file2 = new File(dir);
            fos = new FileOutputStream(file2);
            bos = new BufferedOutputStream(fos);
            IOUtils.copy(tis, bos);
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          if (bos != null) {
            bos.close();
          }
          if (fos != null) {
            fos.close();
          }
        }
      }
      System.out.println("解压完成......");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (tis != null) {
        tis.close();
      }
      if (fis != null) {
        fis.close();
      }
    }
  }

  public static boolean unCompress(String filePath,String unCompressPath) throws Exception {
    String fileType = filePath.toUpperCase();
    if(fileType.endsWith(".TAR")){
      System.out.println("解压的.TAR包");
      //.TAR包用一般的FileInputStream流读取
      unTar(new FileInputStream(filePath),unCompressPath);
    }
    else if(fileType.endsWith(".TAR.GZ")){
      System.out.println("解压的.TAR.GZ包");
      //.TAR.GZ包要用GzipCompressorInputStream读取
      unTar(new GzipCompressorInputStream(new FileInputStream(filePath)),unCompressPath);
    }
    else if(fileType.endsWith(".TAR.BZ2")){
      System.out.println("解压的.TAR.BZ2包");
      unTar(new BZip2CompressorInputStream(new FileInputStream(filePath)),unCompressPath);
    }
    else if(fileType.endsWith(".ZIP")){
      System.out.println("解压的.ZIP包");
      zipUnCompress(filePath,unCompressPath);
    }
    else{
      System.out.println("暂不支持该种格式文件的解压");
    }
    return true;
  }

  public static void main(String[] args) throws Exception {

    unCompress("D:\\test\\zip\\nginx-1.18.0.rar","D:\\test\\zip");

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍java实现文件夹解压和压缩,包括了java实现文件夹解压和压缩的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现文件夹解压和压缩的具体代码,供大家参考,具体内容如下 效果 实现多个文件以及文件夹的压缩和解压 代码分析 小结 压缩 ZipOutputStream可以把多份数据写入zip包; 解压 ZipInputStream可以读取zip格式的流; 以上就是本

  • 本文向大家介绍Android如何实现压缩和解压缩文件,包括了Android如何实现压缩和解压缩文件的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴java代码了,具体代码如下所示: Java代码 代码到此结束,关于Android实现压缩和解压缩文件的全内容就给大家介绍这么多,希望能够帮助到大家!

  • 本文向大家介绍基于Node.js实现压缩和解压缩的方法,包括了基于Node.js实现压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当然,gzip 在 Windows 下很少有人接触。 tar 是一种归档格式,它默认不会压缩,需要结合 gzip 来将最终的 tar 文件以 gzip 格式压缩成为一个 tar.gz 文件,通常

  • 本文向大家介绍基于pako.js实现gzip的压缩和解压功能示例,包括了基于pako.js实现gzip的压缩和解压功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了基于pako.js实现gzip的压缩和解压功能。分享给大家供大家参考,具体如下: 运行效果图如下: poko.js可至Github下载:https://github.com/nodeca/pako 或者点击此处本站下载。

  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:

  • 本文向大家介绍使用java API实现zip递归压缩和解压文件夹,包括了使用java API实现zip递归压缩和解压文件夹的使用技巧和注意事项,需要的朋友参考一下 一、概述 在本篇文章中,给大家介绍一下如何将文件进行zip压缩以及如何对zip包解压。所有这些都是使用Java提供的核心库java.util.zip来实现的。 二、压缩文件 首先我们来学习一个简单的例子-压缩单个文件。将一个名为test