zip4j压缩使用总结
一、引入依赖
<dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.1</version></dependency>
二、使用添加文件(addFiles)的方式生成压缩包
/*** @Author wangtw* @Description 使用addFiles方式压缩文件* @Date 07:34 2023/11/22* @param fileList 需要压缩的文件列表* @param zipPath zip包路径* @param password zip包密码* @return**/public static void zip(ArrayList<File> fileList, String zipPath, String password) {ZipParameters parameters = new ZipParameters();// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);if (StringUtils.hasText(password)) {parameters.setEncryptFiles(true);// 加密方式parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);parameters.setPassword(password.toCharArray());}try {ZipFile zipFile = new ZipFile(zipPath);zipFile.addFiles(fileList, parameters);} catch (ZipException e) {e.printStackTrace();}}
三、使用添加流(addStream)的方式生成压缩文件
/*** @Author wangtw* @Description 使用addStream方式压缩文件* @Date 20:01 2023/11/22* @param fileList 文件列比啊* @param zipPath zip包路径* @param password 密码* @return**/public static void zipByInputStream(ArrayList<File> fileList, String zipPath, String password) throws ZipException, FileNotFoundException {ZipFile zipFile = new ZipFile(zipPath);for (File file : fileList) {InputStream inputStream = new FileInputStream(file);ZipParameters parameters = new ZipParameters();// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);if (StringUtils.hasText(password)) {parameters.setEncryptFiles(true);// 加密方式parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);parameters.setPassword(password.toCharArray());}parameters.setSourceExternalStream(true);parameters.setFileNameInZip(file.getName());zipFile.addStream(inputStream, parameters);// 关闭输入流IOUtils.closeQuietly(inputStream);}}
四、向压缩包输出流(ZipOutputStream)中写入文件
1、示例代码
/*** 压缩文件到输出流中* @param fileList 文件列表* @param outputStream 压缩包输出流* @param password 压缩包密码* @throws IOException* @throws ZipException*/public static void zipOutputStream(ArrayList<File> fileList, OutputStream outputStream, String password) throws IOException, ZipException {ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);for (File file : fileList) {ZipParameters parameters = new ZipParameters();// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);if (StringUtils.hasText(password)) {parameters.setEncryptFiles(true);// 加密方式parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);parameters.setPassword(password.toCharArray());}parameters.setSourceExternalStream(true);parameters.setFileNameInZip(file.getName());zipOutputStream.putNextEntry(null, parameters);InputStream inputStream = new FileInputStream(file);byte[] bytes=new byte[1024 * 1024];int len;while((len = inputStream.read(bytes)) != -1){zipOutputStream.write(bytes,0, len);}IOUtils.closeQuietly(inputStream);zipOutputStream.closeEntry();}zipOutputStream.finish();}
2、测试代码
@Testpublic void zipOutputStreamTest() {File fileone = new File("/Users/outenmon/workspace/idea_workspace/java/cento-practice/src/main/resources/io-test/test.txt");File filetwo = new File("/Users/outenmon/workspace/idea_workspace/java/cento-practice/src/main/resources/application.yaml");ArrayList<File> fileList = new ArrayList<>();fileList.add(fileone);fileList.add(filetwo);OutputStream outputStream = null;try {outputStream = new FileOutputStream(new File(new Date().getTime() + ".zip"));zipOutputStream(fileList, outputStream, "123456");} catch (FileNotFoundException e) {e.printStackTrace();} catch (ZipException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(outputStream);}}
五、异常总结
1、net.lingala.zip4j.exception.ZipException: input file is null
需要把ZipParameters对象的isSourceExternalStream属性设置为true,例如:parameters.setSourceExternalStream(true);
2、net.lingala.zip4j.exception.ZipException: file name is empty for external stream
需要设置ZipParameters对象的fileNameInZip属性,例如:parameters.setFileNameInZip(file.getName());
代码地址:
https://gitee.com/wangtianwen1996/cento-practice/blob/master/src/test/java/com/xiaobai/Zip4jTest.java
相关文章:
zip4j压缩使用总结
一、引入依赖 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.1</version></dependency>二、使用添加文件(addFiles)的方式生成压缩包 /*** Author wan…...
【第一部分:概述】ARM Realm Management Monitor specification
目录 概述机密计算系统软件组成MonitorRealmRealm Management Monitor (RMM)Virtual Machine (VM)HypervisorSecure Partition Manager (SPM)Trusted OS (TOS)Trusted Application (TA) Realm Management Monitor 参考文献 概述 RMM是一个软件组件,它构成了实现ARM…...
切换服务器上自己用户目录下的 conda 环境和一个外部的 Conda 环境
如果我们有自己的 Miniconda 安装和一个外部的 Conda 环境(比如一个全局安装的 Anaconda),我们可以通过修改 shell 环境来切换使用它们。这通常涉及到更改 PATH 环境变量,以便指向你想要使用的 Conda 安装的可执行文件:…...
移动端的自动化基于类实现启动一次应用跑全部用例
1.unittest框架 class TestStringMethods(unittest.TestCase): def setUp(self) -> None: # 每一条测试用例开始前执行 print("setup") def tearDown(self) -> None: # 每一条测试用例结束后执行 print("teardown") …...
Python与设计模式--抽象工厂模式
Python与设计模式–抽象工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上,有三类可以选择的上餐品:汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后࿰…...
JSP:MVC
一个好的Web应用: 功能完善、易于实现和维护易于扩展等的体系结构 一个Web应用通常分为两个部分: 1. 由界面设计人员完成的表示层(主要做网页界面设计) 2. 由程序设计人员实现的行为层(主要完成本Web应用的各种功能…...
微服务-京东秒杀
1 项目介绍 技术栈 后端 SpringCloud 中Netflix 五大组件: EurekaRibbonHystrixOpenfeignZuul SpringBootSpringSpringMVCMyBatis 数据库 MySQLRedis 前端 html5cssjsjQuery 消息中间件 RabbitMQ 2 项目搭建 项目分析 后端 shop-parent [pom] (商…...
「MACOS限定」 如何将文件上传到GitHub仓库
介绍 本期讲解:如何在苹果电脑上上传文件到github远程仓库 注:写的很详细 方便我的朋友可以看懂操作步骤 第一步 在电脑上创建一个新目录(文件夹) 注:创建GitHub账号、新建github仓库、git下载的步骤这里就不过多赘…...
python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)
python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny) 这次实验,我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测,然后后面又使用了Canny算法进行边缘检测。 直接看代码,代…...
【Unity入门】鼠标输入和键盘输入
Unity的Input类提供了许多监听用户输入的方法,比如我们常见的鼠标,键盘,手柄等。我们可以用Input类的接口来获取用户的输入信息 一、监听鼠标输入 GetMouseButtonUp 、GetMouseButtonDown、GetMouseButton input.GetMouseButtonDown和 inp…...
芯知识 | MP3语音芯片IC的优势特征及其在现代科技应用中的价值
随着科技的飞速发展,MP3语音芯片作为一种高度集成的音频处理解决方案,在现代电子产品中发挥着越来越重要的作用。本文将分析MP3语音芯片的优势特征,并探讨其在各个领域的应用价值。 一、MP3语音芯片的优势特征 MP3语音芯片具有多种显著的优…...
C语言进阶之路-基本数据小怪篇
目录 一、学习目标: 二、数据基本类型 整型 浮点型 / 实型 字符 字符串 布尔型数据 三、重要的杂七杂八知识点 常量与变量 标准输入 sizeof运算符: 类型转换 数据类型的本质 整型数据尺寸 可移植性整型 拿下第一个C语言程序 总结 一、学…...
【OpenCV实现图像:使用OpenCV生成拼图效果】
文章目录 概要通用配置不考虑间隔代码实现考虑间隔代码实现小结 概要 概要: 拼图效果是一种将图像切割为相邻正方形并重新排列的艺术效果。在生成拼图效果时,可以考虑不同的模式,包括是否考虑间隔和如何处理不能整除的部分。 不考虑间隔&a…...
【AOSP】生成签名文件release key,通过Android源码对apk进行签名
简介 现在apk都需要签名,Flutter做的项目官方规定编译apk必须签名。 签名的好处: 应用来源验证: 应用签名允许Android系统验证应用的来源。每个应用都使用开发者的私钥进行签名,而应用的签名信息包含在应用的APK文件中。当用户尝…...
深度学习之基于Tensorflow银行卡号码识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介银行卡号码识别的步骤TensorFlow的优势 二、功能三、系统四. 总结 一项目简介 # 深度学习基于TensorFlow的银行卡号码识别介绍 深度学习在图像识别领域取得…...
第95步 深度学习图像目标检测:Faster R-CNN建模
基于WIN10的64位系统演示 一、写在前面 本期开始,我们学习深度学习图像目标检测系列。 深度学习图像目标检测是计算机视觉领域的一个重要子领域,它的核心目标是利用深度学习模型来识别并定位图像中的特定目标。这些目标可以是物体、人、动物或其他可识…...
设计模式—里氏替换原则
1.概念 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影…...
PyTorch包
进入PyTorch的官网: pytorch GitHub 点击GitHub: 进入PyTorch的主目录: 进入Vision reference: detection: 这就是我们在训练过程中会使用到的文件了:...
22、什么是中间件和权限拦截中间件实操
新建中间件 middleware\auth.js // 定义权限判断中间件,中间件的第一个参数是context export default ({store, redirect}) > {console.log("中间件被调用")// if (!store || !store.state.userinfo) {// redirect("/")// } }页面使用…...
vue.config.js
proxy代理 proxy选项用于配置开发服务器的代理。下面是proxy的全部属性: 1. target (String | Object | Function): 指定要代理的目标主机的URL。可以是一个字符串,也可以是一个对象或函数,用于动态返回目标URL。 2. forward (Boolean): 控…...
跨越JDK17兼容鸿沟:ButterKnife编译报错深度解析与实战修复
1. 当JDK17遇上ButterKnife:问题根源全解析 最近在Android Studio升级到最新版本后,不少开发者遇到了一个棘手的编译错误。错误信息大致是这样的:"superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RS…...
STM32F103C8T6 GPIO八种模式到底怎么选?从按键到I2C,新手避坑指南
STM32F103C8T6 GPIO八种模式实战指南:从按键到I2C的智能选择 第一次接触STM32的GPIO配置时,面对八种工作模式的选择,我曾在实验室熬到凌晨三点——按键死活检测不到信号,I2C设备频繁通信失败。后来才发现,问题都出在模…...
【Spring Boot 4.0 Agent-Ready 架构终极指南】:20年架构师亲授JVM字节码增强实战与生产级Agent集成规范
第一章:Spring Boot 4.0 Agent-Ready 架构全景认知Spring Boot 4.0 将 JVM Agent 集成能力提升至核心架构层级,标志着可观测性、运行时增强与无侵入式治理正式成为开箱即用的一等公民。Agent-Ready 并非仅指支持 Java Agent 加载,而是构建了一…...
Proteus 8.13 + STM32F103R6:5分钟搞定LED闪烁仿真(附完整工程文件)
Proteus与STM32F103R6极速入门:5分钟实现LED呼吸灯效果 当你想快速验证一个嵌入式想法时,等待硬件到货往往是最煎熬的。上周我帮一个学生调试毕业设计,他盯着空荡荡的开发板插座发呆的样子让我想起自己初学时的窘境——直到发现Proteus这个神…...
别再手动复制DLL了!Qt Creator + CMake一键配置OpenCV库(附完整配置流程)
Qt Creator CMake自动化配置OpenCV全攻略:告别手动DLL搬运时代 每次新建Qt项目都要手动复制OpenCV的DLL文件?还在为项目迁移后找不到依赖库而头疼?今天我要分享的这套工作流,能让你的开发效率提升300%。作为一个在计算机视觉领域…...
Janus-Pro-7B效果展示:同一张建筑图纸→生成技术描述+施工建议文本
Janus-Pro-7B效果展示:同一张建筑图纸→生成技术描述施工建议文本 1. 模型效果惊艳展示 Janus-Pro-7B作为新一代统一多模态模型,在建筑图纸理解和技术文本生成方面展现出了令人印象深刻的能力。通过一张普通的建筑平面图,这个模型不仅能准确…...
CANET-2E-U开发板透明socket开发实战:5分钟搞定CAN总线数据收发
CANET-2E-U开发板透明socket开发实战:5分钟搞定CAN总线数据收发 在工业自动化领域,CAN总线因其高可靠性和实时性成为设备通信的首选方案。但传统CAN开发往往需要复杂的驱动和专用API,让不少工程师望而却步。周立功推出的CANET-2E-U开发板通过…...
车辆轨迹跟踪MPC、神经网络NN+自适应神经模糊系统ANFIS优化模型预测仿真(带参考文献)
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
3分钟快速修复损坏二维码:QrazyBox终极指南
3分钟快速修复损坏二维码:QrazyBox终极指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否遇到过打印模糊的会议签到二维码、被咖啡渍污染的电子门票,或者手机拍…...
树莓派CM4打造高效NAS:PiBox 2 Mini硬件与软件解析
1. PiBox 2 Mini硬件架构解析PiBox 2 Mini的核心设计理念是将树莓派CM4模块的灵活性与专业存储设备的功能性相结合。作为一款紧凑型网络存储解决方案,其硬件架构充分考虑了家庭和小型办公室环境下的实际需求。1.1 核心计算模块选型采用树莓派CM4模块作为计算核心是经…...
