java 解压tar.gz示例代码

时间:2021-05-17 21:11:06
/**
 * Tar文件解压方法
 *
 * @param tarGzFile
 *            要解压的压缩文件名称(绝对路径名称)
 * @param destDir
 *            解压后文件放置的路径名(绝对路径名称)
 * @return 解压出的文件列表
 */
public static List<String> deCompressGZipFile(String tarGzFile, String destDir) {

   List<String> fileList = new ArrayList<String>();

   OutputStream out = null; // 建立输出流,用于将从压缩文件中读出的文件流写入到磁盘
   FileInputStream fis = null; // 建立输入流,用于从压缩文件中读出文件
   GZIPInputStream gis = null;

   TarArchiveInputStream taris = null;
   TarArchiveEntry entry = null;
   TarArchiveEntry[] subEntries = null;

   File entryFile = null;
   File subEntryFile = null;
   String entryFileName = null;

   int entryNum = 0;
   try {
      fis = new FileInputStream(tarGzFile);
      gis = new GZIPInputStream(fis);
      taris = new TarArchiveInputStream(gis);

      while ((entry = taris.getNextTarEntry()) != null) {
         entryFileName = destDir + FILE_PATH_SEPARATOR + entry.getName();
         entryFile = new File(entryFileName);
         entryNum++;
         if (entry.isDirectory()) {
            if (!entryFile.exists()) {
               entryFile.mkdir();
            }
            subEntries = entry.getDirectoryEntries();
            for (int i = 0; i < subEntries.length; i++) {
               try {
                  subEntryFile = new File(entryFileName + FILE_PATH_SEPARATOR + subEntries[i].getName());
                  fileList.add(entryFileName + FILE_PATH_SEPARATOR + subEntries[i].getName());
                  out = new FileOutputStream(subEntryFile);
                  byte[] buf = new byte[1024];
                  int len = 0;
                  while ((len = taris.read(buf)) != -1) {
                     out.write(buf, 0, len);
                  }
               } catch (Exception e) {
                  log.error("deCompressing file failed:" + subEntries[i].getName() + "in" + tarGzFile);
               } finally {
                  out.close();
                  out = null;
               }
            }
         } else {
            fileList.add(entryFileName);
            out = new FileOutputStream(entryFile);
            try {
               byte[] buf = new byte[1024];
               int len = 0;
               while ((len = taris.read(buf)) != -1) {
                  out.write(buf, 0, len);
               }
            } catch (Exception e) {
               log.error("deCompressing file failed:" + entryFileName + "in" + tarGzFile);
            } finally {
               out.close();
               out = null;
            }
         }
      }

      if (entryNum == 0) {
         log.warn("there is no entry in " + tarGzFile);
      }

   } catch (Exception e) {
      log.warn("decompress failed", e);
   } finally {
      if (taris != null) {
         try {
            taris.close();
         } catch (Exception ce) {
            taris = null;
         }
      }
      if (gis != null) {
         try {
            gis.close();
         } catch (Exception ce) {
            gis = null;
         }
      }
      if (fis != null) {
         try {
            fis.close();
         } catch (Exception ce) {
            fis = null;
         }
      }
      if (out != null) {
         try {
            out.close();
         } catch (Exception ce) {
            out = null;
         }
      }
   }
   return fileList;

}