`

java压缩文件生成XXX.tar.gz压缩包

 
阅读更多
生成XXX.tar.gz压缩文件有两种方式,可以先打包后压缩,还可以打包压缩同时进行。

所用到的jar包见附件,若用maven,pom.xml文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.it.bill</groupId>
  <artifactId>bill_project.gi</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>bill_project.gi</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
    	<groupId>junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>4.10</version>
    </dependency>
    <dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.8</version>
	</dependency>
	<dependency>
		<groupId>javax.mail</groupId>
		<artifactId>mail</artifactId>
		<version>1.4</version>
	</dependency>
	<dependency>
		<groupId>commons-io</groupId>
		<artifactId>commons-io</artifactId>
		<version>2.4</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-compress</artifactId>
		<version>1.5</version>
	</dependency>
  </dependencies>
</project>





package com.bill;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.CompressorException;
import org.apache.commons.compress.compressors.CompressorOutputStream;
import org.apache.commons.compress.compressors.CompressorStreamFactory;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.io.FileUtils;

public class TestCompressSnapshotFiles {
  
  public static void main(String[] args) {
    try {
      String sourceFileDirPath = "C:/opt/webhost/pn/testCompressSnapshotXmlFiles/tempFileDir/";
      File sourceFileDir = new File(sourceFileDirPath);
      
      if (sourceFileDir.isDirectory()) {
        File[] sourceFileArr = sourceFileDir.listFiles(new FilenameFilter() {
          public boolean accept(File dir, String name) {
            return name.endsWith(".xml");
          }
        });
        
        /**
         * the first way, packaging before they are compressed
         */
        String targetFilePath = "C:/opt/webhost/pn/testCompressSnapshotXmlFiles/firstCompressedPackage.tar";
        File targetFile = new File(targetFilePath);
        File tarFile = packSnapshotXmlFiles(sourceFileArr, targetFile);
        compressSnapshotXmlFiles(tarFile);
        
        /**
         * the second way, packaging and compression at the same time
         */
        targetFilePath = "C:/opt/webhost/pn/testCompressSnapshotXmlFiles/secondCompressedPackage.tar.gz";
        targetFile = new File(targetFilePath);
        packAndCompressSnapshotXmlFiles(sourceFileArr, targetFile);
      } else {
        System.err.println("This is not folder: " + sourceFileDirPath);
      }
      
      System.out.println("----- Compress snapshot xml files end. ----");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  private static void packAndCompressSnapshotXmlFiles(File[] sourceFileArr,
      File targetFile) throws IOException, CompressorException {
    FileOutputStream fileOutputStream = null;
    CompressorOutputStream gzippedOut = null;
    TarArchiveOutputStream taos = null;
    
    try {
      fileOutputStream = FileUtils.openOutputStream(targetFile);
      
      gzippedOut = new CompressorStreamFactory().createCompressorOutputStream(
          CompressorStreamFactory.GZIP, fileOutputStream);
      
      taos = new TarArchiveOutputStream(gzippedOut);
      for (File perFile : sourceFileArr) {
        System.out.println(
            "current file name: " + perFile.getName() + ", length: "
                + perFile.length() / 1024);
        TarArchiveEntry tae = new TarArchiveEntry(perFile, perFile.getName());
        taos.putArchiveEntry(tae);
        taos.write(FileUtils.readFileToByteArray(perFile));
        taos.closeArchiveEntry();
      }
    } catch (IOException ioe) {
      throw ioe;
    } catch (CompressorException ce) {
      throw ce;
    } finally {
      if (taos != null) {
        try {
          taos.close();
        } catch (IOException e) {
        }
      }
      
      if (gzippedOut != null) {
        try {
          gzippedOut.close();
        } catch (IOException e) {
        }
      }
    }

  }

  private static void compressSnapshotXmlFiles(File tarFile) throws IOException {
    File target = new File(tarFile.getAbsolutePath() + ".gz");
    FileInputStream fis = null;
    GZIPOutputStream gzipOs = null;
    
    try {
      fis = new FileInputStream(tarFile);
      
      gzipOs = new GZIPOutputStream(new FileOutputStream(target));
      
      /*byte[] buffer = new byte[1024];
      int n = -1;
      while((n = fis.read(buffer)) != -1) {
        gzipOs.write(buffer, 0, n);
      }*/
      IOUtils.copy(fis, gzipOs);
      
      // delete the template tar file
      tarFile.deleteOnExit();
    } catch (FileNotFoundException fnfe) {
      System.err.println("file not found: " + tarFile.getAbsolutePath());
      throw fnfe;
    } catch (IOException ioe) {
      System.err.println("create gizp output stream fail");
      throw ioe;
    } finally {
      if (fis != null) {
        try {
          fis.close();
        } catch (IOException e) {
        }
      }
      
      if (gzipOs != null) {
        try {
          gzipOs.close();
        } catch (IOException e) {
        }
      }
    }
    
    
  }

  private static File packSnapshotXmlFiles(File[] sourceFileArr, File targetFile) throws IOException {
    FileOutputStream fos = null;
    TarArchiveOutputStream taos = null;
    try {
      fos = new FileOutputStream(targetFile);
      
      taos = new TarArchiveOutputStream(fos);
      
      for (File perFile : sourceFileArr) {
        System.out.println("current file name: " + perFile.getName() + ", length: " + perFile.length()/1024);
        taos.putArchiveEntry(new TarArchiveEntry(perFile, perFile.getName()));
        IOUtils.copy(new FileInputStream(perFile), taos);
        //taos.write(FileUtils.readFileToByteArray(perFile));
        taos.closeArchiveEntry();
      }
      
      //This line is very import, otherwise the compressed file can't successfully decompressed
      taos.finish();
    } catch (FileNotFoundException fnfe) {
      System.err.println("File not found: " + targetFile.getAbsolutePath());
      throw fnfe;
    } catch (IOException ioe) {
      System.err.println("put archive entry fail.");
      throw ioe;
    } finally {
      if (fos != null) {
        try {
          fos.close();
        } catch (IOException e) {
        }
      }
      
      if (taos != null) {
        try {
          taos.close();
        } catch (IOException e) {
        }
      }
    }
    
    return targetFile;
  }

}




分享到:
评论

相关推荐

    node-v12.17.0-headers.tar.gz

    标题 "node-v12.17.0-headers.tar.gz" 暗示了这是一个针对 Node.js 版本 12.17.0 的头文件压缩包。这个压缩包通常用于开发人员编译和创建与 Node.js C++ 扩展模块相关的项目。Node.js 是一个基于 Chrome V8 引擎的 ...

    node-v10.21.0-headers.tar.gz

    标题中的"node-v10.21.0-headers.tar.gz"表明这是一款与Node.js相关的软件包,具体是Node.js版本10.21.0的头文件集合,存储格式为tar.gz,这是一种常见的在Linux和Unix系统中使用的归档和压缩格式。头文件在编程中...

    subversion-1.6.1.tar.gz

    标题中的 "subversion-1.6.1.tar.gz" 表示这是一个 Subversion 的特定版本,即 1.6.1 版本,被打包成 tarball 格式(.tar.gz)的文件。 描述中提到的 "包含 subversion-1.6.1.tar.gz、subversion-deps-1.6.1.tar.gz...

    jdk-8u201-linux-x64.tar.gz jdk8版本下载

    对于名为“jdk-8u201-linux-x64.tar.gz”的压缩包,它是专为64位Linux系统设计的。要安装这个JDK,你需要按照以下步骤操作: 1. **下载**:你可以通过Oracle官网或者第三方镜像站点下载到这个文件。在Linux终端中,...

    jre-8u251-windows-x64.tar.gz

    描述中提到的"jdk-8u251-windows-x64.tar.gz"实际上应该是"jre-8u251-windows-x64.tar.gz"的误写,这里应该是描述JRE的文件,而不是Java Development Kit(JDK)。JDK是用于开发和编译Java程序的工具集,包含JRE以及...

    xxx.tar.gz_BAD

    标题中的"xxx.tar.gz_BAD"表明这是一个以".tar.gz"为格式的压缩文件,并且被标记为"BAD",这通常意味着该文件可能是有害的或存在问题的。".tar.gz"是一种常见的文件打包和压缩格式,它结合了tar(用于打包多个文件)...

    setuptools.tar.gz

    setuptools.tar.gz是一个包含了setuptools源代码的压缩包文件,通常用于在Linux这样的类Unix系统上进行安装。在这个场景中,它被提及是因为在尝试使用pymssql这个Python模块时,可能需要先确保setuptools已经正确...

    Ubuntun下压缩与解压的格式、工具与命令

    * gzip -d xxx.gz:解压缩文件 xxx.gz * gzip -r xxx:对文件夹 xxx 进行压缩 * gzip -rd xxx.gz:对文件夹 xxx 进行解压缩 三、bzip2 压缩工具 bzip2 工具与 gzip 工具类似,只是 bzip2 工具负责压缩和解压缩.bz2...

    LibreOffice-7.4.7-Linux-x86-64-rpm.tar.gz

    在这个特定的压缩包"LibreOffice-7.4.7-Linux-x86-64-rpm.tar.gz"中,包含的是适用于64位Linux系统的RPM(Red Hat Package Manager)格式的安装文件。 首先,我们来详细了解一下LibreOffice的主要组件和功能: 1. ...

    cmake-3.21.1-linux-x86_64.tar.gz

    在"cmake-3.21.1-linux-x86_64.tar.gz"这个压缩包中,我们找到了CMake的3.21.1版本,特别针对Linux系统且为x86_64架构。该版本可能包含了以下组件: 1. **bin** 目录:包含可执行文件,如`cmake`、`ccmake`、`cpack...

    nagios-plugins-2.1.4.tar.gz

    1. **下载与解压**:首先,你需要从官方或者可靠的源下载“nagios-plugins-2.1.4.tar.gz”文件,然后使用tar命令进行解压,例如`tar -zxvf nagios-plugins-2.1.4.tar.gz`。 2. **编译与安装**:解压后,进入解压后...

    mysql-5.7.26.tar.gz

    首先,"mysql-5.7.26.tar.gz" 是MySQL 5.7.26版本的源代码压缩包,采用的是gzip压缩格式,通常用于Linux或类UNIX系统。`tar`命令用于打包文件,而`gzip`则负责压缩,通过`tar -zxvf`命令可以解压这个压缩包,将源...

    cmake-2.8.10.tar.gz

    在本例中,我们看到的`cmake-2.8.10.tar.gz`是一个压缩包,包含了CMake的源代码版本2.8.10。这个版本相对比较旧,因为当前CMake已经更新到了3.x系列。不过,对于学习CMake的基本概念和用法,以及了解它的历史,这个...

    struts-1.2.7-lib.tar.gz

    在"struts-1.2.7-lib.tar.gz"压缩包中,包含了Struts框架运行所需的库文件,对于Java Web开发者来说是必不可少的。 首先,我们来看一下`struts-1.2.7-lib`这个目录下的文件,它们主要包括以下几个部分: 1. **核心...

    qla2xxx-src-v8.07.00.56.11.3-k1.tar.gz

    这个压缩包qla2xxx-src-v8.07.00.56.11.3-k1.tar.gz包含了驱动的源代码,供开发者研究、定制和编译,以适应不同环境的需求。 首先,我们来了解下qla2xxx HBA卡。HBA卡是连接服务器或存储设备到光纤通道网络的关键...

    tofrodos-1.7.12a.tar.gz

    这种命名格式表明它是一个使用gzip压缩的tar归档文件,是Linux/Unix系统中常见的打包方式,用于收集多个文件或目录并进行压缩,便于传输和存储。 描述中提到的“dos2unix”是一个经典的工具,用于在DOS/Windows和...

    pip-10.0.1.tar

    `pip-10.0.1.tar.gz`是一个gzip压缩过的tar文件,这样的打包方式可以有效减小文件体积,便于传输和存储。在Linux或MacOS系统中,可以通过`tar -zxvf pip-10.0.1.tar.gz`命令解压,然后通过`python setup.py install`...

    cmake-3.11.0-Linux-x86_64.tar.gz

    在给定的压缩包"cmake-3.11.0-Linux-x86_64.tar.gz"中,我们找到了CMake的一个预编译版本,适用于Linux操作系统且针对x86_64架构。这个版本是3.11.0,发布于2018年,它包含了CMake的所有组件和必要的库,使得用户...

    cmake_3.5.1.orig.tar.gz

    在"cmake_3.5.1.orig.tar.gz"这个文件中,我们看到的是 CMake 3.5.1 版本的原始源代码压缩包。这个版本发布于2016年,是CMake历史上的一个重要里程碑,它包含了许多改进和新功能。 1. **CMake 3.5.1 的新特性**: ...

Global site tag (gtag.js) - Google Analytics