首先要明确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>
下面是具体的代码。
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。如下图所示。