把多个文件打包压缩成tar.gz文件并解压的Java实现
压缩文件
在Java中,可以 使用GZIPOutputStream创建gzip(gz)压缩文件,它在commons-compress下面,可以通过如下的maven坐标引入:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
tar.gz文件可以理解为通过如下方式获取的文件:先用tar打包,再使用gz进行压缩。下面直接上代码:
package com.eg.wiener.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import java.io.*;
import java.util.zip.GZIPOutputStream;
@Slf4j
public class FileUtils {
/**
*
* 压缩文件
*
* @param sourceFolder 指定打包的源目录
* @param tarGzPath 指定目标 tar 包的位置
*/
private static void compress(String sourceFolder, String tarGzPath) {
log.info("压缩后文件名:{}", tarGzPath);
TarArchiveOutputStream tarOs = null;
try {
// 创建一个 FileOutputStream 到输出文件(.tar.gz)
FileOutputStream fos = new FileOutputStream(tarGzPath);
// 创建一个 GZIPOutputStream,用来包装 FileOutputStream 对象
GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos));
// 创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream 对象
tarOs = new TarArchiveOutputStream(gos);
// 使文件名支持超过 100 个字节
tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
File sourceFile = new File(sourceFolder);
//遍历源目录的文件,将所有文件迁移到新的目录tarGzPath下
File[] sources = sourceFile.listFiles();
for (File oneFile : sources) {
addFilesToTarGZ(oneFile.getPath(), "", tarOs);
}
} catch (IOException e) {
log.error("压缩失败,", e);
} finally {
try {
tarOs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param sourcePath 源文件
* @param parent 源目录
* @param tarArchive 压缩输出流
* @throws IOException
*/
public static void addFilesToTarGZ(String sourcePath, String parent, TarArchiveOutputStream tarArchive) throws IOException {
File sourceFile = new File(sourcePath);
// 获取新目录下的文件名称
String fileName = parent.concat(sourceFile.getName());
//打包压缩该文件
tarArchive.putArchiveEntry(new TarArchiveEntry(sourceFile, fileName));
if (sourceFile.isFile()) {
FileInputStream fis = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fis);
// 写入文件
IOUtils.copy(bis, tarArchive);
tarArchive.closeArchiveEntry();
bis.close();
} else if (sourceFile.isDirectory()) {
// 因为是个文件夹,无需写入内容,关闭即可
tarArchive.closeArchiveEntry();
// 遍历文件夹下的文件
for (File f : sourceFile.listFiles()) {
// 递归遍历文件目录树
addFilesToTarGZ(f.getAbsolutePath(), fileName + File.separator, tarArchive);
}
}
}
}
解压文件
解压文件时依赖的jar包如下:
<!--解压-->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.5</version>
</dependency>
压缩文件时遇到了繁琐的关闭资源的问题,故这里优先考虑使用try-with-resources,而不是try-finally。由此带来的好处是使代码更简洁、更清晰,即便是抛出的异常,也更有价值,这些优点是try-finally无法做到的。
/**
* 解压tar.gz 文件
* @param targzFile 要解压的tar.gz文件对象
* @param outPath 要解压到某个指定的目录下
* @throws IOException
*/
public static void unpack(File targzFile, String outPath) {
// 验证参数
if (targzFile == null || !targzFile.isFile() || StringUtils.isEmpty(outPath)) {
log.error("文件解压缩执行异常,请检查输入参数!");
return;
}
// 读取 .tar.gz 文件转换为 tar 文件
try (FileInputStream is = new FileInputStream(targzFile);
BufferedInputStream bis = new BufferedInputStream(is);
GZIPInputStream gzipIs = new GZIPInputStream(bis);
TarInputStream tarIs = new TarInputStream(gzipIs, 1024 * 2)) {
// 迭代 tar 文件集合,解压文件
for (TarEntry entry = tarIs.getNextEntry(); entry != null; entry = tarIs.getNextEntry()) {
File targetFileName = new File(outPath + "/" + entry.getName());
IOUtils.copy(tarIs, new FileOutputStream(targetFileName));
}
log.info("文件 {} 解压完毕", targzFile);
} catch (Exception e) {
log.error("{} 解压异常!", targzFile, e);
}
}
测试用例就放在一个main函数里了,如下所示:
public static void main(String[] args) throws IOException {
// 把F:\img\source内的文件及其文件夹打包成名为文件夹F:\img\target下的、名字为六位随机数的 gz 压缩包
String targetPath = "F:\\img\\target\\" + RandomStringUtils.randomAlphanumeric(6) + ".tar.gz";
compress("F:\\img\\source", targetPath);
log.info("=====done====");
unpack(new File(targetPath) , "F:\\img\\unpack");
}
小结
小编楼兰胡杨在此介绍了如何把多个文件压缩成gz文件,并实现解压。如果你有更好的方案,请留言。
把多个文件打包压缩成tar.gz文件并解压的Java实现的更多相关文章
- Windows下将文件打包压缩成 .tar.gz格式
1.下载 “7-ZIP”,安装完成后进入需要打包的文件夹 2. 右击选择“添加到压缩包” 3.压缩格式:tar 4. 得到.tar文件,将其打包 5. 压缩格式为:gzip 6. 得到tar.gz格式 ...
- linux 文件打包压缩成.tar.gz
tar czvf beian.drcluod.cn.20180509.tar.gz ./beian.drcloud.cn/*
- 把linux文件夹压缩成tar.gz的命令
解压 tar zxvf 文件名.tar.gz 压缩 tar zcvf software.tar.gz /usr/local/software
- Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件
项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...
- 如何将文件压缩成.tar.gz格式的文件
1.下载“7-ZIP“这个软件 2.安装7-ZIP以后,直接在你想要打包的文件上点右键菜单,会有一个7-ZIP的子菜单栏,类似WinRAR和WinZIP的那种右键菜单.然后选“7-ZIP”->“ ...
- Windows下压缩成tar.gz格式
tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ...
- tar.gz,直接解压可用?还是需要编译安装?
在linux搭建环境,下载的tar.gz安装包,有的直接解压就可以用,有的需要编译安装后才可用 怎么知道该怎么操作呢? 其实,tar -zxvf解压后,进入目录看README.md就知道答案了 另外, ...
- .tar.gz 和.tgz 解压
wget {url} 下载 eg: wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.24/bin/apac ...
- linux把文件压缩成.tar.gz的命令
https://blog.csdn.net/qq_27803491/article/details/52785838
- 使用Java API进行tar.gz文件及文件夹压缩解压缩
在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...
随机推荐
- script crossorigin 属性
来源:https://juejin.cn/post/6969825311361859598 <script src="xxxx" crossorigin="anon ...
- manim边学边做--局部缩放的场景类
在动画制作中,尤其是数学和科学可视化领域,有时我们需要将观众的注意力集中在场景的某个特定部分. Manim提供了一个强大的工具 ZoomedScene,它允许我们在场景中创建一个独立的缩放视图,从而实 ...
- Mermaid Live Editor 如何调整方向
在 Mermaid Live Editor 中,默认情况下,流程图和序列图等都是按照从左到右的方向来布局的.但是,如果你想要创建一个从上到下(纵向)布局的图形,你可以使用 TD(Top-Down,即从 ...
- xpath 定位单选框
分析页面结构: 整个页面只有一组radiogroup 一个group地下存在两个radio 思路定位到页面唯一元素->下面具体radio 代码: //div[@class='el-radio-g ...
- Python面向对象-反射
python面向对象-反射 在python的面向对象中,与用户交互的主要方式就是利用反射来判断用户输入的指令是否存在和可执行 反射的定义 在python中反射主要是应用于类的对象上,在运行时,将对象的 ...
- 地球OL攻略 —— 某应届生求职总结
某应届生的苦逼求职总结 1.自我介绍,阐述一下自己过去的情况 2.目前的就业情况以及从事的就业方向 3.你在面试的时候遇到什么困难?是怎么帮忙解决的 4.当初为什么会选择选择这一行? 5.分享一下学习 ...
- GPU的硬件组成及运行原理
GPU的硬件组成 GPU 是一种专门为图形处理而设计的处理器,它的设计目标是在处理大规模.高并发的图形数据时提供高效的计算能力.与 CPU 相比,GPU 的处理器数量更多,每个处理器的计算能力相对较弱 ...
- DEV插件--Spreadsheet1电子表格
常用操作Spreadsheet常用属性标题栏是否可见 Spreadsheet1.TitleBar.Visible=true标题栏背景颜色 Spreadsheet1.TitleBar.Interior. ...
- 异常--java进阶day08
1.异常 java中,所有的异常都是类 2.异常的体系结构 3.编译时异常与运行时异常 1.编译时异常 语法完全正确,但是代码就是会报错,如下图 上图中,写的是时间格式化类的使用,parse方法将给的 ...
- Debian 9 更换源
Debian 全球镜像站 # 先备份源列表文件 mv /etc/apt/sources.list /etc/apt/sources.list.bak # 生成新的源列表文件(用的国内源镜像) echo ...