解压并解压缩Java中的多个压缩文件

时间:2020-01-09 10:35:26  来源:igfitidea点击:

在Java创建Tar归档文件中的GZIP多个文件一文中,我们已经看到我们需要为多个文件创建一个tar归档文件,然后使用GZIP对其进行压缩。在本文中,我们将介绍如何在Java中解压缩多个压缩文件,首先需要解压缩gz文件(.tar.gz),然后再解压缩该tar球。

用Java解压缩压缩文件并解压缩存档

此处给出的Java程序用于解压缩以.tar.gz压缩的多个文件,它使用Apache Commons Compress库,可以从以下路径下载该文件https://commons.apache.org/proper/commons-compress/download_compress.cgi

此处使用的版本是commons-compress-1.18,因此commons-compress-1.18.jar已添加到类路径。

从Apache Commons Compress库中,有两个文件用于解压缩gzip文件和解压缩tar归档文件。

TarArchiveEntry –表示Tar归档文件中的条目。

TarArchiveInputStream –此类具有方法getNextTarEntry()从TarArchiveEntry读取存档条目。在循环这些归档条目时,请检查它是目录还是文件。如果是目录,则只需创建该目录,以防文件读取文件内容并将其写入输出流。

Java程序–解压缩Gzip文件并解压缩

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;

public class UntarArchive {
  public static void main(String[] args) {
    String COMPRESSED_FILE = "/home/theitroad/Documents/test.tar.gz";
    String DESTINATION_PATH = "/home/theitroad/Documents/";
    File destFile = new File(DESTINATION_PATH);
    unTarFile(COMPRESSED_FILE, destFile);
  }
  private static void unTarFile(String tarFile, File destFile) {
    TarArchiveInputStream tis = null;
    try {
      FileInputStream fis = new FileInputStream(tarFile);
      // .gz
      GZIPInputStream gzipInputStream = new GZIPInputStream(new BufferedInputStream(fis));
      //.tar.gz
      tis = new TarArchiveInputStream(gzipInputStream);
      TarArchiveEntry tarEntry = null;
      while ((tarEntry = tis.getNextTarEntry()) != null) {
        System.out.println(" tar entry- " + tarEntry.getName());
        if(tarEntry.isDirectory()){
          continue;
        }else {
          // In case entry is for file ensure parent directory is in place
          // and write file content to Output Stream
          File outputFile = new File(destFile + File.separator + tarEntry.getName());
          outputFile.getParentFile().mkdirs();	        
          IOUtils.copy(tis, new FileOutputStream(outputFile));
        }
      }      		
    }catch(IOException ex) {
      System.out.println("Error while untarring a file- " + ex.getMessage());
    }finally {
      if(tis != null) {
        try {
          tis.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }	
  }
}

如果只想解压缩文件,则必须解压缩.tar文件而不是.tar.gz文件,则可以跳过创建GZIPInputStream的操作。

Instead of this

FileInputStream fis = new FileInputStream(tarFile);
GZIPInputStream gzipInputStream = new GZIPInputStream(new BufferedInputStream(fis));
TarArchiveInputStream tis = new TarArchiveInputStream(gzipInputStream);

Have this instead

FileInputStream fis = new FileInputStream(tarFile);
TarArchiveInputStream tis = new TarArchiveInputStream(new BufferedInputStream(fis));