文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java压缩与解压缩ZIP文件

2023-09-11 19:30

关注

文章目录

前言

在现代计算机上,数据传输和存储越来越依赖于文件压缩技术。当我们需要发送大量数据时,压缩文件可以大大减少传输时间和网络带宽,而且压缩文件还可以帮助我们节省磁盘空间。在Java中提供了压缩和解压缩文件的功能,可以使用java.util.zip包中的类来实现。本篇将对如何使用 Java 实现单文多件压缩和解压缩进行总结。

文件压缩指的是将一个或多个文件通过压缩算法,将其存储为一个更小的文件,以便于存储和传输。压缩的原理是通过对文件的数据进行编码和压缩,使其占用更少的空间。压缩后的文件可以通过解压缩算法还原成原始的文件格式。在文件压缩过程中,常见的操作是将多个文件打包成一个压缩文件,例如zip、tar等格式。

Java解压缩文件

常见的文件压缩格式包括:

Java提供了多种用于压缩和解压缩文件的API,主要包括以下类和方法:

压缩和解压缩ZIP文件

通过使用Java 自带的 java.util.zip 类库下的ZipOutputStreamZipInputStreamZipEntry实现文件的压缩和解压缩,其中ZipOutputStream用于创建ZIP压缩文件输出流输出ZIP压缩文件,ZipInputStream用于创建ZIP文件输入流读取ZIP文件用于解压缩而ZipEntry对应ZIP压缩包中的每个被压缩对象;

检验

主要测试使用上述代码压缩单文件和解压缩单文件能否成功以后测量单个文件的处理耗时,同时测试单文件夹多文件压缩和解压缩能否成功以及处理耗时,单元测试代码如下:

@Testvoid testJavaUtilZip(){    // 测试压缩和解压缩单文件ZIP    // 被压缩的MP4单文件,大小112.5MB    File inputFile = new File("/Users/zlc/Documents/own/images/GPT-4 Developer Livestream.mp4");    // ZIP文件路径    File zipFile = new File("/Users/zlc/Documents/own/mp4.zip");    // ZIP 解压缩路径    File unzipFile = new File("/Users/zlc/Documents/own/unzip");    long start = System.currentTimeMillis();    // 压缩文件    ZipFileUtil.zipCompress(inputFile, zipFile);    long end = System.currentTimeMillis();    System.out.println("ZIP-压缩单文件耗时:" + (end - start) + "毫秒");    start = System.currentTimeMillis();    ZipFileUtil.zipDecompress(zipFile, unzipFile);    end = System.currentTimeMillis();    System.out.println("ZIP-解压缩单文件耗时:" + (end - start) + "毫秒");    // 单文件夹多文件压缩和解压缩测试    // 文件夹大小2.42G    File inputFiles = new File("/Users/zlc/Documents/own/images");    File zipFiles = new File("/Users/zlc/Documents/own/imagesZip.zip");    File unzipFiles = new File("/Users/zlc/Documents/own/imagesUnzip");    start = System.currentTimeMillis();    // 压缩文件    ZipFileUtil.zipCompress(inputFiles, zipFiles);    end = System.currentTimeMillis();    System.out.println("ZIP - 多文件压缩耗时:" + (end - start) + "毫秒");    start = System.currentTimeMillis();    ZipFileUtil.zipDecompress(zipFiles, unzipFiles);    end = System.currentTimeMillis();    System.out.println("ZIP - 多文件解压缩耗时:" + (end - start) + "毫秒");}

测试结果如下:

ZIP-压缩单文件耗时:5492毫秒ZIP-解压缩单文件耗时:1920毫秒ZIP - 多文件压缩耗时:136059毫秒ZIP - 多文件解压缩耗时:45739毫秒

同时测试了设置不同压缩等级的耗时比较,结果如下:

// 不同压缩等级下的处理耗时 BEST_COMPRESSION 2.43G 文件夹耗时119801毫秒快两分钟了BEST_SPEED 2.43G 文件夹耗时112646毫秒 也没差多少,但确实快了

结论:

测试环境为MacOS 四核Intel Core i7,16G内存,处理将近2.5G大小的文件夹耗时接近两分钟,效率十分低下,在总文件大小不大的时候可以考虑使用JDK自带的压缩工具类。

应用

设计一个API,通过使用Hutool生成两个CSV文件和一个Excel文件,将这三个文件放入到ZIP压缩包中,当通过浏览器调用API时,下载ZIP压缩包。

同时在服务器上不生成CVS、EXCEL以及Zip文件而是直接通过HttpServletResponse将文件传送给客户端,避免服务器因过多生成这些文件导致服务硬盘不够用(PS:生成文件以后基本上不会有人管了,会随着时间的增加爆炸式增加,当然如果你需要留存建议生成本地文件存储到OSS中),代码如下:

  @GetMapping(value = "/downloadZip")public String downloadZipFile(HttpServletResponse response) {    // 设置响应头    response.setContentType("application/octet-stream");    response.setHeader("Content-Disposition", "attachment; filename=download.zip");    try (ZipOutputStream outputStream = new ZipOutputStream(response.getOutputStream())) {        ExcelWriter writer = new ExcelWriter(true);        List<String> header = Arrays.asList("开始日期", "结束日期", "算法厂商", "期末资产总额", "累计成交金额",                "期间委托笔数", "期间成交笔数", "期间撤单笔数");        writer.writeHeadRow(header);        List<List<String>> rows = new ArrayList<>();        rows.add(Arrays.asList("张三", "里斯", "男", "张三", "里斯", "男", "张三", "里斯"));        rows.add(Arrays.asList("李四", "王武", "女", "张三", "里斯", "男", "张三", "里斯"));        writer.write(rows);        writer.passRows(1);        List<String> header1 = Arrays.asList("日期", "资金账号", "算法母单编号", "委托编号", "交易所", "股票代码",                "委托数量", "交易方向", "订单类型", "委托价格", "委托状态", "累计成交数量", "累计成交金额");        writer.writeHeadRow(header1);        writer.autoSizeColumn(writer.getCurrentRow());        List<List<String>> rows2 = new ArrayList<>();        rows2.add(Arrays.asList("张三", "里斯", "男", "张三", "里斯", "男", "张三", "里斯", "找大大", "赵打打", "炸", "茅台", "米线"));        rows2.add(Arrays.asList("李四", "王武", "女", "张三", "里斯", "男", "张三", "里斯", "找大大", "赵打打", "炸", "茅台", "米线"));        writer.write(rows2);        writer.autoSizeColumnAll();        ZipEntry entry = new ZipEntry("数据.xlsx");        outputStream.putNextEntry(entry);        writer.flush(outputStream);        writer.close();        outputStream.closeEntry();        ZipEntry entry1 = new ZipEntry("母单.csv");        outputStream.putNextEntry(entry1);        CsvWriter csvWriter1 = new CsvWriter(new OutputStreamWriter(outputStream));        String[] csvHead1 = {"日期", "资金账号", "算法厂商", "算法", "算法母单编号", "交易所", "股票代码", "委托数量", "交易方向", "启动时间", "停止时间", "算法状态"};        csvWriter1.writeLine(csvHead1);        String[] csvData1 = {"20230203", "98830901", "XX", "TWAP", "12984", "SH", "600000", "10000", "4", "102311", "112311", "1"};        String[] csvData2 = {"20230203", "98830901", "XX", "TWAP", "12984", "SH", "600000", "10000", "4", "102311", "112311", "1"};        csvWriter1.writeLine(csvData1);        csvWriter1.writeLine(csvData2);        csvWriter1.flush();        outputStream.closeEntry();        ZipEntry entry2 = new ZipEntry("子单.csv");        outputStream.putNextEntry(entry2);        CsvWriter csvWriter2 = new CsvWriter(new OutputStreamWriter(outputStream));        String[] csvHead2 = {"日期", "资金账号", "算法母单编号", "委托编号", "交易所", "股票代码", "委托数量", "交易方向", "订单类型", "委托价格", "委托状态", "累计成交数量", "累计成交金额"};        csvWriter2.writeLine(csvHead2);        String[] csvData3 = {"20230203", "98830901", "12984", "ord1122", "SH", "600000", "1000", "4", "1", "7.23", "1", "800", "5600"};        String[] csvData4 = {"20230203", "98830901", "12984", "ord1122", "SH", "600000", "1000", "4", "1", "7.23", "1", "800", "5600"};        csvWriter2.writeLine(csvData3);        csvWriter2.writeLine(csvData4);        csvWriter2.flush();        outputStream.closeEntry();        outputStream.finish();        return "success";    } catch (Exception e) {        return "faild";    }}

总结

Java 自带的 java.util.zip 类库是一个基础的压缩和解压缩类库,它提供了很基本的压缩和解压缩功能。在处理小型文件或数据时,java.util.zip 是一个可行的选择。不过,对于大型文件或数据的处理,效率可能会受到影响。相比之下,一些第三方的类库如 Apache Commons Compress、Zip4j 等提供了更为高级的压缩和解压缩功能,同时也提供了更好的性能。
本文首发于香菜喵,打开微信随时随地读,文章下方 ↓ ↓ ↓

来源地址:https://blog.csdn.net/chen15369337607/article/details/130591293

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯