解决文件导出过大->java压缩zip文件--封装工具类

阿丹:

        在业务逻辑中的数据存在一部分业务场景,在导出文件或者视频的时候需要将文件暂存在服务器上再上传到oss对象存储或者fastdfs中让用户来下载使用。但是出现的问题就是如果目标文件过大,文件的上传云端和下载本地就会时间拉长,并且网络延迟和波动的成本就大幅增加。

        本工具类解决的就是在文件上传云端之前将文件进行压缩为zip文件。

工具类

工具类的使用方式在文件中有注释


import org.apache.poi.util.IOUtils;import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** 方便压缩文件使用*/
public class PoiZipUtil {private static final int BUFFER_SIZE = 2 * 1024;/*** 压缩成ZIP 方法1** @param srcDir           压缩文件夹路径* @param out              压缩文件输出流* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;*                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException {ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {IOUtils.closeQuietly(zos);}}/*** 压缩成ZIP 方法2** @param srcFiles 需要压缩的文件列表* @param out      压缩文件输出流* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {long            start = System.currentTimeMillis();ZipOutputStream zos   = null;try {zos = new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf = new byte[BUFFER_SIZE];zos.putNextEntry(new ZipEntry(srcFile.getName()));int             len;FileInputStream in = new FileInputStream(srcFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}zos.closeEntry();in.close();}long end = System.currentTimeMillis();} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {IOUtils.closeQuietly(zos);}}/*** 递归压缩方法** @param sourceFile       源文件* @param zos              zip输出流* @param name             压缩后的名称* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;*                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws Exception*/private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception {byte[] buf = new byte[BUFFER_SIZE];if (sourceFile.isFile()) {// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int             len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {File[] listFiles = sourceFile.listFiles();if (listFiles == null || listFiles.length == 0) {// 需要保留原来的文件结构时,需要对空文件夹进行处理if (KeepDirStructure) {// 空文件夹的处理zos.putNextEntry(new ZipEntry(name + "/"));// 没有文件,不需要文件的copyzos.closeEntry();}} else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (KeepDirStructure) {// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了compress(file, zos, name + "/" + file.getName(), KeepDirStructure);} else {compress(file, zos, file.getName(), KeepDirStructure);}}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用python读取EXCEL放假日历并制作订阅文件

前言 不想升级IOS&#xff0c;苦于找不到新的日历订阅url&#xff0c;小菜鸡百度来百度去发现ics这东西可以自己做一个&#xff0c;惊喜于看到了这篇文章--使用python获取日历信息并制作订阅文件_https: //github.com/lk-itween/calendar-CSDN博客 感谢作者大大。就想自己写一…

滑动窗口双指针

力扣 209 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 类似窗口滑动 j代表的是窗口的结束位置 i表示开始位置 在while循环中是寻找最…

服务器数据恢复-昆腾存储StorNext文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 昆腾某型号存储&#xff0c;StorNext文件存储系统。 共有9个分别配置了24块磁盘的磁盘柜&#xff0c;其中8个磁盘柜存放普通数据&#xff0c;1个磁盘柜存放元数据。 存放元数据的磁盘柜中的24块磁盘组建了8组RAID1阵列和1组4盘RAID10阵列&#…

NCV8460ADR2G在汽车和工业应用中高压侧驱动如何破?

NCV8460ADR2G是一款完全保护的高压侧驱动器&#xff0c;可用于开关各种负载&#xff0c;如灯泡、电磁阀和其他致动器。该器件可以通过有源电流限制和高温关断针对过载情况进行内部保护。 诊断状态输出引脚提供了高温以及开关状态开路负载情况的数字故障指示。 特性&#xff1a;…

Nginx的location路径与proxy_pass匹配规则

location路径与proxy_pass匹配规则 路径替换总结当访问地址是 http://127.0.0.1/api/user/list注意:location后斜杆与proxy_pass后斜杆"/"问题&#xff0c;最好要么两者都加斜杆&#xff0c;要么都不加 路径替换 配置proxy_pass时&#xff0c;可以实现URL路径的部分…

22 Vue3中使用v-for遍历对象

概述 使用v-for遍历对象在真实的开发中比较少见&#xff0c;了解即可。 对象我更喜欢统一称之为字典&#xff0c;假如你哪天发现我在某个前端的教程中把对象叫做字典&#xff0c;请你知道这两个是同一个玩意儿。 所谓字典&#xff0c;就是一种key-value类型的结构的统称。 …

队列(C语言版)

一.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有 先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网&#xff1a;https://www.vmware.com 二.下载安装Kali Kali包含数百种工具&#xff0c;可用于各种信息安全任务&#xff0c;例如渗透测试、…

vue中判断应该import 哪个js或css

import Vue from vue import App from ./App.vueif (window.myFlag true) {import(./jsFile1.js).then((module) > {// 执行导入的jsFile1.js模块的代码module.default.init()}) } else {import(./jsFile2.js).then((module) > {// 执行导入的jsFile2.js模块的代码modul…

vue导出element表格,xlsx和xlsx-style生成xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码&#xff0c;一旦引入xlsx-style则会报错 xlsx-style使用中常见问题及解决办法&#xff1a; xlsx-style使用中常见问题及解决办法-CSDN博客 在\n…

SpringBoot 多环境开发配置文件

在开发过程中&#xff0c;往往开发环境和生产环境需要不同的配置。为了兼容两种运行环境&#xff0c;提高开发效率&#xff0c;可以使用多环境开发配置文件。 配置文件结构大概是这样&#xff1a; application.yml -主启动配置文件&#xff08;用于控制使用哪种环境配…

Flink系列之:Apache Kafka SQL 连接器

Flink系列之&#xff1a;Apache Kafka SQL 连接器 一、Apache Kafka SQL 连接器二、依赖三、创建Kafka 表四、可用的元数据五、连接器参数六、特性七、Topic 和 Partition 的探测八、起始消费位点九、有界结束位置十、CDC 变更日志&#xff08;Changelog&#xff09; Source十一…

Java:获取当前线程的线程组

代码示例&#xff1a; package com.thb;public class Demo4 {public static void main(String[] args) {ThreadGroup threadGroup Thread.currentThread().getThreadGroup();System.out.println(threadGroup.getName());} }运行输出&#xff1a;

“2024山西智博会”由中国人工智能学会和省科学技术协会联合主办

近日&#xff0c;山西省政府新闻办近日举行了“山西加快转型发展”系列主题新闻发布会的第六场发布会&#xff0c;同时也是“推动数字经济发展壮大”专场发布会。在发布会上&#xff0c;省委、省政府强调了数字经济的重要性&#xff0c;并将其作为重组要素资源、重塑经济结构、…

【无标题】欢迎使用Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

第五节TypeScript 运算符

一、描述 运算符用于执行程序代码运算。 二、运算符主要包括&#xff1a; 算术运算符逻辑运算符关系运算符按位运算符赋值运算符三元/条件运算符字符串运算符类型运算符 1、算术运算符 y5&#xff0c;对下面算术运算符进行解释&#xff1a; 运算符 描述 例子 x 运算结果…

Jtti:Tomcat服务器底层原理是什么

Apache Tomcat 是一个开源的、轻量级的应用服务器&#xff0c;用于执行Java Servlet、JavaServer Pages (JSP) 和其他相关技术的Web应用程序。以下是 Tomcat 服务器底层的主要原理&#xff1a; Servlet容器&#xff1a; Tomcat 是一个Servlet容器&#xff0c;实现了Java Servle…

ros2 humble安装joint_state_publisher功能包

第一步从GitHub下载此功能包&#xff1a;命令 git clone -b ros2 https://github.com/ros/joint_state_publisher.git 然后执行里面的setup.py文件就完成安装&#xff1b;命令是 sudo python setup.py install 最后检查是不是有安装好&#xff0c;输入命令&#xff1a; ro…

多表插入、删除操作(批量)——后端

多表插入 场景&#xff1a;当添加一个菜品时&#xff0c;还需要记录菜品的口味信息&#xff0c;因此需要对菜品表&#xff08;dish&#xff09;和口味表&#xff08;dish_flavor&#xff09;同时进行插入操作。 两个表的字段&#xff1a; 代码思路&#xff1a;由DishControll…

PSP - 结构生物学中的机器学习 (NIPS MLSB Workshop 2023.12)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135120094 Machine Learning in Structural Biology (机器学习在结构生物学中) 网址&#xff1a;https://www.mlsb.io/ Workshop at the 37th Co…