Java将文本文件压缩为tar.gz
压缩
思路
- 准备输出流
- FileOutputStream
- BufferedOutputStream
- TarOutputStream
- GZIPOutputStream
- 准备输入流
- FileInputStream
- BufferedInputStream
- 将文件打包为tar
- 在将打包后的tar文件压缩
- 准备输出流
代码
/**
* @功能描述 压缩tar.gz 文件
* @param resourceList 源文件集合
* @param outPath 目标文件
* @return 返回压缩结果
* @throws Exception
*/
@PrintRunTime(function="压缩tar.gz文件")
public static void packet(List<File> resourceList, String outPath) throws Exception {
//1. 参数验证, 初始化输出路径
if(resourceList == null || resourceList.size() < 1 || !Verify.isEmpty(outPath)){
throw new ServiceException("文件压缩执行异常, 非法参数!");
}
long startTime = System.currentTimeMillis();
// 2. 迭代源文件集合, 将文件打包为Tar
try (FileOutputStream fileOutputStream = new FileOutputStream(outPath+".tmp");
BufferedOutputStream bufferedOutput = new BufferedOutputStream(fileOutputStream);
TarOutputStream tarOutputStream = new TarOutputStream(bufferedOutput);) {
for (File resourceFile : resourceList) {
if(!resourceFile.isFile()){
continue;
}
try(FileInputStream fileInputStream = new FileInputStream(resourceFile);
BufferedInputStream bufferedInput = new BufferedInputStream(fileInputStream);){
TarEntry entry = new TarEntry(new File(resourceFile.getName()));
entry.setSize(resourceFile.length());
tarOutputStream.putNextEntry(entry);
IOUtils.copy(bufferedInput, tarOutputStream);
} catch (Exception e) {
throw new ServiceException("文件["+resourceFile+"]压缩执行异常, 嵌套异常: \n" + e.toString());
}finally {
tarOutputStream.closeEntry();
}
}
} catch (Exception e) {
Files.delete(Paths.get(outPath+".tmp"));
throw new ServiceException("文件压缩至["+outPath+"]执行异常, 嵌套异常: \n" + e.toString());
}
//3. 读取打包好的Tar临时文件文件, 使用GZIP方式压缩
try (FileInputStream fileInputStream = new FileInputStream(outPath+".tmp");
BufferedInputStream bufferedInput = new BufferedInputStream(fileInputStream);
FileOutputStream fileOutputStream = new FileOutputStream(outPath);
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(fileOutputStream);
BufferedOutputStream bufferedOutput = new BufferedOutputStream(gzipOutputStream);
) {
byte[] cache = new byte[1024];
for (int index = bufferedInput.read(cache); index != -1; index = bufferedInput.read(cache)) {
bufferedOutput.write(cache,0,index);
}
long endTime = System.currentTimeMillis();
Log.info("文件["+outPath+"]压缩执行完毕, 耗时:" + (endTime - startTime) + "ms");
} catch (Exception e) {
throw new ServiceException("文件压缩至["+outPath+"]执行异常, 嵌套异常: \n" + e.toString());
}finally {
Files.delete(Paths.get(outPath+".tmp"));
}
}
解压
思路
- 准备输入流
- FileInputStream
- BufferedInputStream
- GZIPInputStream
- TarInputStream
- 准备输出流
- FileOutputStream
- 将文件转换为TarInputStream流对象, 输出即可
- 准备输入流
代码
/**
* @功能描述 解压tar.gz文件
* @param targzFile tar.gz压缩文件
* @param outPath 存放解压后文件的目录
* @return 返回结果
* @throws ServiceException
*/
public static void unpack(File targzFile, String outPath) throws ServiceException {
//1. 验证参数, 初始化输出路径
if(targzFile == null || !targzFile.isFile() || !Verify.isEmpty(outPath) || PathHandler.initPath(outPath) == null){
throw new ServiceException("文件解压缩执行异常, 非法参数!");
}
long startTime = System.currentTimeMillis();
//2. 读取tar.gz文件转换为tar文件
try (FileInputStream fileInputStream = new FileInputStream(targzFile);
BufferedInputStream bins = new BufferedInputStream(fileInputStream);
GZIPInputStream gzipInputStream = new GZIPInputStream(bins);
TarInputStream tarIn = new TarInputStream(gzipInputStream, 1024 * 2)) {
//3. 迭代tar文件集合, 解压文件
for (TarEntry entry = tarIn.getNextEntry(); entry != null; entry = tarIn.getNextEntry()){
File targetFileName = new File(outPath + "/" + entry.getName());
IOUtils.copy(tarIn, new FileOutputStream(targetFileName));
}
long endTime = System.currentTimeMillis();
Log.info("文件["+targzFile+"]解压执行完毕, 耗时:" + (endTime - startTime) + "ms");
} catch (Exception e) {
throw new ServiceException("[" + targzFile + "] 解压执行异常, " + e.toString());
}
}
Java将文本文件压缩为tar.gz的更多相关文章
- Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件
项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...
- java,maven工程打tar.gz包执行main方法
一,需要在pom.xml文件添加plugin, 项目目录结构 <build> <plugins> <plugin> <artifactId>maven- ...
- Windows下将文件打包压缩成 .tar.gz格式
1.下载 “7-ZIP”,安装完成后进入需要打包的文件夹 2. 右击选择“添加到压缩包” 3.压缩格式:tar 4. 得到.tar文件,将其打包 5. 压缩格式为:gzip 6. 得到tar.gz格式 ...
- 把linux文件夹压缩成tar.gz的命令
解压 tar zxvf 文件名.tar.gz 压缩 tar zcvf software.tar.gz /usr/local/software
- 压缩文件tar.gz和zip之间的区别
我们在开发的时候通常要先下载相关的软件或者是源码,或者是jar包.在下载东西的时候总是碰见后缀是.tar.gz和.zip的问题,搞不清楚是怎么回事,不晓得下载哪个文件才是对自己有用的.现在我知道了,其 ...
- Windows下压缩成tar.gz格式
tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ...
- 如何将文件压缩成.tar.gz格式的文件
1.下载“7-ZIP“这个软件 2.安装7-ZIP以后,直接在你想要打包的文件上点右键菜单,会有一个7-ZIP的子菜单栏,类似WinRAR和WinZIP的那种右键菜单.然后选“7-ZIP”->“ ...
- tar压缩文件 .tar.gz
打包并压缩文件 tar -zcf ansible.tar.gz ansible/* z gzip属性 c 建立压缩文件 f 指定文件名 v 显示过程 解压文件 tar xzf ...
- linux 文件打包压缩成.tar.gz
tar czvf beian.drcluod.cn.20180509.tar.gz ./beian.drcloud.cn/*
随机推荐
- C#通过HttpListener实现HTTP监听
代码: using NLog; using System; using System.Diagnostics; using System.IO; using System.Net; using Sys ...
- 利用BLCR加速android的启动(android4.2)
BOSS要求提高安卓系统的启动速度,优化bootloader和kernel后,发现还是达不到要求,没办法才打起zygote的注意. ================================== ...
- Qt实现长文件名(字符串)在QLabel中自适应缩短
一.应用场景简述 当在有限宽度的QLable中显示很长的文件名/字符串时,超出QLabel宽度部分将不会显示,此时采取缩短文件名策略(也可实现为字符串滚动动画)可以缓解这一问题.在实现这一想法的过程中 ...
- 在 Visual Studio中 将 Objective-C 编译为 C++
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- 设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)
声明: 找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存. 只要虚拟内存设置为系统默认大小就不会出生僵死的现象了. 当时因为服务器内存48G,系统默认虚拟内存大小也是48G, 觉得太占硬盘空间, ...
- 插件化一(android)
插件化设计概述(android) 一. 模块划分 Basic模块包括:初始化接口.插件加载接口.插件更新接口和埋点接口. a) 初始化接口:完成一些必要的初始化 ...
- [每天记录一个Bug]Cell中由于block加载网络请求产生的复用
Bug 出现场景: cell中使用加载图片的网络请求出现复用,截图如下: 复用原因: Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 ...
- pomelo使用中的常见问题
1.端口被占用, 有进程没杀干净. 用 pomelo kill --force 命令清一下进程.
- Java Collection秋招复习
抽象类和接口的区别 我们先来看一下抽象类 * @auther draymonder */ public abstract class AbstractClassTest { private int T ...
- 利用org.mybatis.generator生成实体类
springboot+maven+mybatis+mysql 利用org.mybatis.generator生成实体类 1.添加pom依赖: 2.编写generatorConfig.xml文件 ( ...