当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/242339.html

相关文章:

  • 【第一部分:概述】ARM Realm Management Monitor specification
  • 切换服务器上自己用户目录下的 conda 环境和一个外部的 Conda 环境
  • 移动端的自动化基于类实现启动一次应用跑全部用例
  • Python与设计模式--抽象工厂模式
  • JSP:MVC
  • 微服务-京东秒杀
  • 「MACOS限定」 如何将文件上传到GitHub仓库
  • python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)
  • 【Unity入门】鼠标输入和键盘输入
  • 芯知识 | MP3语音芯片IC的优势特征及其在现代科技应用中的价值
  • C语言进阶之路-基本数据小怪篇
  • 【OpenCV实现图像:使用OpenCV生成拼图效果】
  • 【AOSP】生成签名文件release key,通过Android源码对apk进行签名
  • 深度学习之基于Tensorflow银行卡号码识别系统
  • 第95步 深度学习图像目标检测:Faster R-CNN建模
  • 设计模式—里氏替换原则
  • PyTorch包
  • 22、什么是中间件和权限拦截中间件实操
  • vue.config.js
  • 80C51单片机----数据传送类指令
  • 【Golang】使用泛型对数组进行去重
  • Ps:画笔工具的基本操作
  • 【Apache Doris】一键实现万表MySQL整库同步 | 快速体验
  • 35.逻辑运算符
  • ASP.NET Core 启用CORS
  • io.lettuce.core.RedisCommandExecutionException
  • vue3 导出数据为 excel 文件
  • PyQt6简介
  • 某60区块链安全之未初始化的存储指针实战二学习记录
  • 软件工程第十二周