Java实现将多个文件打入tar.gz包中

首先要明确tar.gz这种格式文件的含义。

.tar文件只是用来打包,没有压缩。

而.gz则采用了gzip压缩。

以·tar.gz为后缀的文件是一种压缩文件,在Linux和macOS下常见,也可以使用后缀名.tgz表示。

那么Java如何实现将多个文件打进tar包,然后再gzip压缩呢?

打tar包我借助了apache的commons-compress依赖,而gzip压缩我直接使用了JDK原生的GZIPOutputStream类

commons-compress依赖如下。

 <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-compress</artifactId>
      <version>1.18</version>
    </dependency>

下面是具体的代码。

扫描二维码关注公众号,回复: 13119963 查看本文章
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;

import java.io.*;
import java.util.zip.GZIPOutputStream;

public class CompressTest {
    public static void writeToTar(TarArchiveOutputStream tout,String srcPath,String pathInTar,String fileName) throws IOException {
        byte[] b = new byte[1024];
        int len;
        // 构建一个Entry
        TarArchiveEntry e = new TarArchiveEntry(pathInTar+fileName);
        // 设置Entry大小,这一步必须得有,否则会报错
        e.setSize(new File(srcPath + fileName).length());
        // put一个Entry
        tout.putArchiveEntry(e);
        // 写入文件
        InputStream in = new FileInputStream(srcPath + fileName);
        while ((len = in.read(b)) != -1){
            tout.write(b,0,len);
        }
        in.close();
        // 关闭Entry
        tout.closeArchiveEntry();
    }
    public static void main(String[] args) throws IOException {
        // 根目录
        String srcPath = "F:/test/tar/";
        String fileName1 = "hello.txt";
        String pathInTar1 = "hello/";
        String fileName2 = "ok.txt";
        String pathInTar2 = "ok/";
        String tarName = "okhello.tar";

        // 构建TarArchiveOutputStream
        TarArchiveOutputStream tout = new TarArchiveOutputStream(new FileOutputStream(srcPath+tarName));

        // 写第一个文件
        writeToTar(tout,srcPath,pathInTar1,fileName1);
        // 写第二个文件
        writeToTar(tout,srcPath,pathInTar2,fileName2);

        // 最后关闭TarArchiveOutputStream,tar包就形成了
        tout.close();

        // gzip压缩
        GZIPOutputStream gout = new GZIPOutputStream(new FileOutputStream(srcPath+tarName + ".gz"));
        byte[] b = new byte[1024];
        int len;
        InputStream in = new FileInputStream(srcPath + tarName);
        while ((len=in.read(b)) != -1){
            gout.write(b,0,len);
        }
        gout.close();

    }
}

代码运行成功后,生成的.tar文件和.tar.gz文件如下图所示。

将这两个文件上传到Linux环境上,用tar -zxvf  fileName命令解压,如果是gzip格式,则可以成功解压,否则提示not in gzip format。如下图所示。

猜你喜欢

转载自blog.csdn.net/xl_1803/article/details/114892154
今日推荐