在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputStream去创建gzip(gz)压缩文件,但是java中没有一种官方的API可以去创建tar.gz文件。所以我们需要使用到第三方库Apache Commons Compress去创建.tar.gz文件。

在pom.xml中,我们可以通过如下的maven坐标引入commons-compress。

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

解释说明

  1. tar文件准确的说是打包文件,将文件打包到一个tar文件中,文件名后缀是.tar
  2. Gzip是将文件的存储空间压缩保存,文件名后缀是.gz
  3. tar.gz.tgz通常是指将文件打包到一个tar文件中,并将它使用Gzip进行压缩。

如果您阅读完本文觉得对您有帮助的话,请给我一个赞,您的支持是我不竭的创作动力!

一、将两个文件打包到tar.gz

下面的这个例子是将2个文件打包为tar.gz压缩文件。下文代码中的流操作使用了try-with-resources语法,所以不用写代码手动的close流。

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.junit.jupiter.api.Test;import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;public class TarGzTest {@Testvoid testFilesTarGzip() throws IOException {//输入文件,被压缩文件Path path1 = Paths.get("/home/test/file-a.xml");Path path2 = Paths.get("/home/test/file-b.txt");List<Path> paths = Arrays.asList(path1, path2);//输出文件压缩结果Path output = Paths.get("/home/test/output.tar.gz");//OutputStream输出流、BufferedOutputStream缓冲输出流//GzipCompressorOutputStream是gzip压缩输出流//TarArchiveOutputStream打tar包输出流(包含gzip压缩输出流)try (OutputStream fOut = Files.newOutputStream(output);BufferedOutputStream buffOut = new BufferedOutputStream(fOut);GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(buffOut);TarArchiveOutputStream tOut = new TarArchiveOutputStream(gzOut)) {//遍历文件listfor (Path path : paths) {//该文件不是目录或者符号链接if (!Files.isRegularFile(path)) {throw new IOException("Support only file!");}//将该文件放入tar包,并执行gzip压缩TarArchiveEntry tarEntry = new TarArchiveEntry(path.toFile(),path.getFileName().toString());tOut.putArchiveEntry(tarEntry);Files.copy(path, tOut);tOut.closeArchiveEntry();}//for循环完成之后,finish-tar包输出流tOut.finish();}}
}

file-a.xmlfile-b.txt打包到output.tar文件中,并使用gzip对这个tar包进行压缩。可以使用如下命令查看tar包里面包含的文件。

$ tar -tvf /home/test/output.tar.gz
-rw-r--r-- 0/0          23546 2020-08-17 12:07 file-a.xml
-rw-r--r-- 0/0              34  2020-08-17 12:36 file-b.txt

二、将一个文件夹压缩为tar.gz

下面的例子将一个文件夹,包含其子文件夹的文件或子目录,打包为tar,并使用gzip进行压缩。最终成为一个tar.gz打包压缩文件。
其核心原理是:使用到Files.walkFileTree依次遍历文件目录树中的文件,将其一个一个的添加到TarArchiveOutputStream.输出流。

@Test
void testDirTarGzip() throws IOException {// 被压缩打包的文件夹Path source = Paths.get("/home/test");//如果不是文件夹抛出异常if (!Files.isDirectory(source)) {throw new IOException("请指定一个文件夹");}//压缩之后的输出文件名称String tarFileName = "/home/" + source.getFileName().toString() + ".tar.gz";//OutputStream输出流、BufferedOutputStream缓冲输出流//GzipCompressorOutputStream是gzip压缩输出流//TarArchiveOutputStream打tar包输出流(包含gzip压缩输出流)try (OutputStream fOut = Files.newOutputStream(Paths.get(tarFileName));BufferedOutputStream buffOut = new BufferedOutputStream(fOut);GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(buffOut);TarArchiveOutputStream tOut = new TarArchiveOutputStream(gzOut)) {//遍历文件目录树Files.walkFileTree(source, new SimpleFileVisitor<Path>() {//当成功访问到一个文件@Overridepublic FileVisitResult visitFile(Path file,BasicFileAttributes attributes) throws IOException {// 判断当前遍历文件是不是符号链接(快捷方式),不做打包压缩处理if (attributes.isSymbolicLink()) {return FileVisitResult.CONTINUE;}//获取当前遍历文件名称Path targetFile = source.relativize(file);//将该文件打包压缩TarArchiveEntry tarEntry = new TarArchiveEntry(file.toFile(), targetFile.toString());tOut.putArchiveEntry(tarEntry);Files.copy(file, tOut);tOut.closeArchiveEntry();//继续下一个遍历文件处理return FileVisitResult.CONTINUE;}//当前遍历文件访问失败@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) {System.err.printf("无法对该文件压缩打包为tar.gz : %s%n%s%n", file, exc);return FileVisitResult.CONTINUE;}});//for循环完成之后,finish-tar包输出流tOut.finish();}
}

三、解压tar.gz压缩文件

下面一个例子说明如何解压一个tar.gz文件,具体内容请看代码注释。

@Test
void testDeCompressTarGzip() throws IOException {//解压文件Path source = Paths.get("/home/test/output.tar.gz");//解压到哪Path target = Paths.get("/home/test2");if (Files.notExists(source)) {throw new IOException("您要解压的文件不存在");}//InputStream输入流,以下四个流将tar.gz读取到内存并操作//BufferedInputStream缓冲输入流//GzipCompressorInputStream解压输入流//TarArchiveInputStream解tar包输入流try (InputStream fi = Files.newInputStream(source);BufferedInputStream bi = new BufferedInputStream(fi);GzipCompressorInputStream gzi = new GzipCompressorInputStream(bi);TarArchiveInputStream ti = new TarArchiveInputStream(gzi)) {ArchiveEntry entry;while ((entry = ti.getNextEntry()) != null) {//获取解压文件目录,并判断文件是否损坏Path newPath = zipSlipProtect(entry, target);if (entry.isDirectory()) {//创建解压文件目录Files.createDirectories(newPath);} else {//再次校验解压文件目录是否存在Path parent = newPath.getParent();if (parent != null) {if (Files.notExists(parent)) {Files.createDirectories(parent);}}// 将解压文件输入到TarArchiveInputStream,输出到磁盘newPath目录Files.copy(ti, newPath, StandardCopyOption.REPLACE_EXISTING);}}}}//判断压缩文件是否被损坏,并返回该文件的解压目录
private  Path zipSlipProtect(ArchiveEntry entry,Path targetDir)throws IOException {Path targetDirResolved = targetDir.resolve(entry.getName());Path normalizePath = targetDirResolved.normalize();if (!normalizePath.startsWith(targetDir)) {throw new IOException("压缩文件已被损坏: " + entry.getName());}return normalizePath;
}

使用Java API进行tar.gz文件及文件夹压缩解压缩相关推荐

  1. java 压缩文件tar_使用Java API进行tar.gz文件及文件夹压缩解压缩

    在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...

  2. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(四)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  3. 文件夹打包成pkg_linux如何解压tar.gz到指定文件夹或目录

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解如何解压tar.gz到指定文件夹或目录,t ...

  4. 如何将文件压缩成.tar.gz格式的文件

    在使用cifar数据集时候,要将生成的batch转换为tar.gz格式 1.下载"7-ZIP"这个软件 2.安装7-ZIP以后,直接在你想要打包的文件上点右键菜单,会有一个7-ZI ...

  5. linux中 tar .gz bz2 xz 文件怎么用 解压

    tar.gz/xz/bz2 怎么解压 tar 用法:tar最初是用来在磁带机上打包,现在tar可以打包任何文件,将多个文件和目录打包成一个文件,同时还支持 xz/bzip2/gzip 压缩,单独 ta ...

  6. linux如何ubuntu解压tar.gz格式的文件

    两种压缩格式 tar 和 tar.gz TAR 好处是只消耗非常少的CPU及时间打包,只是一个打包工具,并不负责压缩. tar -cvf studio.tar directory_to_compres ...

  7. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(五)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  8. .tar实现对文件和目录的压缩解压缩

    .tar实现对文件和目录的压缩解压缩 1.tar命令 功能描述:将文件或者目录进行打包.或者解压缩 格式:tar [参数] [打包后的文件名] [需要打包的文件或目录] 其中参数包括一下几个: -c ...

  9. java tar.gz 格式多文件打包压缩与解压

    问题背景:开发中,我们时常会遇到对文件进行存储或传输的问题,但如果传输储存的文件较大,浪费磁盘空间不说,还会大大影响程序运行效率.于是便引出了这篇文章的主题,关于文件打包与压缩的问题.这里" ...

最新文章

  1. 『报告』IDC:2018年物联网产业10大预测
  2. 23种设计模式之外观模式(Facade)
  3. cmd 顺序启动服务_window下启动redis步骤和服务报错解决办法
  4. easyui问题小结
  5. GitHub又有了新功能:控诉互联网公司996行为。这个网站被发在GitHub一个小时之后,标星就超过了1000
  6. matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
  7. java.lang.Class解析
  8. Python渗透测试之身份认证攻击
  9. vue echarts 柱状图
  10. vscode设置鼠标滚轮滚动 翻页速度
  11. python3 接口获取数据
  12. 美国地质勘探局官网(USGS)Landsat 8 OLI_TIRS 影像数据下载详解
  13. 【情感分析:挖掘观点、情感和情绪】读书笔记-02
  14. nginx基础:nginx访问限制
  15. 【转载】外设使用Tips之MSCAN接收ID滤波器设置
  16. Python——列表和元组
  17. dsp的ad标志位是什么_关于STM32 AD转换的ADC_FLAG_EOC标志位问题
  18. unity能连jsp吗_使用JSPWiki丰富Unity-UPM包的使用
  19. 从二进制到逻辑门——哲学中诞生的计算理论
  20. C语言:输入某一年的第几天,计算并输出它是这一年的第几月第几日?

热门文章

  1. Java实现 LeetCode 753 破解保险箱(递归)
  2. 尊重兴趣,是尊重生命深处的本能
  3. 电商平台1688按关键词搜索商品接口调用展示
  4. 苹果发布会确认:好莱坞大咖助阵,AirPods 2 等新品或将亮相...
  5. (个人)自媒体快传号注册入驻流程
  6. 50多个java学习网站
  7. 5G手机正逐渐成为国内手机市场主流 “换机潮”或将出现
  8. 高级语言(High-level programming language)
  9. VRML ASP教程
  10. 『实践』Yalmip建模+Cplex类求解