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.pswp.cn/news/160406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯物聯網_STM32L071_2_繼電器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

HarmonyOS應用開發者認證題目滿分指南

為了幫助大家快速的上手HarmonyOS應用程序開發&#xff0c;官方制作了一些免費的課程&#xff1a;HarmonyOS第一課。每個課程后面都有一些練習題&#xff0c;下面就是這些題目的滿分答案。 【習題】運行Hello World工程 判斷題 1.DevEco Studio是開發HarmonyOS應用的一站式集…

定時器如何計算觸發頻率?

定時器觸發頻率的計算公式為&#xff1a;定時器時鐘頻率/&#xff08;預分頻系數*計數周期1&#xff09;。其中&#xff0c;定時器時鐘頻率是指定時器所連接的總線頻率&#xff0c;預分頻系數和計數周期需要根據具體的需求進行設置。預分頻系數用于將總線頻率分頻&#xff0c;計…

Power Apps-下拉列表控件

插入一個下拉列表控件 設置值的兩種方式 1.通過屬性items寫數組設置 2.通過連接數據表&#xff0c;先在右側操作面板中選擇項目中的數據表 再從Value中選擇其中一列&#xff0c;下拉就可以選擇該列全部行的值 但是這樣會導致有很多重復的字段&#xff0c;所以可以在items屬性里…

好用的博客評論系統 Valine 使用及避坑指南

評論系統&#xff0c;即網站的一個小功能&#xff0c;展示評論內容和用戶輸入框。開源免費的評論系統可不多&#xff0c;原來很火的"多說"評論系統都關閉了&#xff0c;而Disqus又是國外的訪問受限。無意間發現了Valine&#xff0c;挺不錯的&#xff0c;分享給大家。…

如何用cmd命令快速搭建FTP服務

環境&#xff1a; Win10專業版 問題描述&#xff1a; 如何用cmd命令快速搭建FTP服務 解決方案&#xff1a; 1.輸入以下命令來安裝IIS&#xff08;Internet Information Services&#xff09;&#xff1a; dism /online /enable-feature /featurename:IIS-FTPServer /all …

IDEA集成Git

一、配置Git忽略文件 例如&#xff1a;用eclipse創建的項目有其特定的文件&#xff0c;例如&#xff1a;.classpath,.project文件&#xff0c;而用IDEA創建的項目也有其特定的文件&#xff1a;.xml,.iml,.target,我們需要最好忽略他們。 為什么要忽略他們&#xff1f; 與項目…

從Github登錄的雙因子驗證到基于時間戳的一次性密碼:2FA、OTP與TOTP

Github于2023-03-09推出一項提高軟件安全標準的措施&#xff0c;所有在Github上貢獻過代碼的開發人員在年底前必須完成 2FA&#xff08;Two-factory authentication&#xff0c;雙因子認證&#xff09;。初聽此事之時&#xff0c;不以為意&#xff0c;因為自己之前就知道雙因子…

關于2023年的裸辭對話

2023: 為什么要裸辭&#xff1f; 小蘇&#xff1a;因為我瘋了 2023&#xff1a;裸辭后悔嗎&#xff1f; 小蘇&#xff1a; 如果很快找到工作就不后悔&#xff0c;但是今年沒有工作&#xff0c;后悔裸&#xff0c;不后悔辭。 2023&#xff1a;關于市場環境的敏感度&#xff…

操作系統(三)| 進程管理下 經典進程問題分析 線程 死鎖

文章目錄 6.經典進程同步問題6.1 生產者-消費者問題 (既有同步又有互斥)6.2 讀者-寫者問題6.3 哲學家進餐問題6.4理發師問題 7. 進程之間通信7.1 共享存儲區7.2 消息傳遞7.3 管道 8.線程8.1 線程的實現機制 9 進程調度9.1 調度方式9.2 常見算法先來先服務 FCFS短進程優先 SPN最…

C++之常用的排序算法

C之常用的排序算法 sort #include<iostream> using namespace std; #include<vector> #include<algorithm> #include<functional> void Myptint(int val) {cout << val << " "; }void test() {vector<int> v;v.push_back(…

打破應用孤島,低代碼平臺效力幾何?

關于低代碼開發平臺&#xff0c;爭論有很多。有人認為它是第四代編程語言&#xff0c;有人認為它是開發模式的顛覆&#xff0c;有人認為它是企業管理模式的變革&#xff0c;也有人認為它空有其表。 不過&#xff0c;至少在目前看來&#xff0c;低代碼無疑是火爆的&#xff0c;…

整理MLAI學習路徑圖

干貨分享&#xff1a; 下面給出一個筆者自己整理的GitHub倉庫&#xff1a;https://github.com/isLinXu/awesome-road-map&#xff0c;里面包含了一些可供參考的學習路徑和思維導圖&#xff0c;并整理微軟、meta、谷歌、Kaggle以及華為、百度、阿里、騰訊、訊飛等相關的學習資源…

一文搞懂什么是 GNU/Linux 操作系統

Author&#xff1a;rab 目錄 前言一、UNIX二、Linux三、GNU 前言 你是否經常看見或聽說過這么一句話&#xff1a;這是一個類 Unix 的 GNU/Linux 操作系統&#xff0c;你是怎么理解這句話的呢&#xff1f;想要搞懂這句話的含義&#xff0c;你需要了解以下三點基本常識。 一、U…

linux ld 鏈接器學習筆記

ld鏈接器筆記 1. 首先編寫一段匯編代碼 這里的匯編語法時 AT&T語法,是gcc原生支持的語法,底層使用 gas(gnu assembler) 完成匯編,相較于 Intel x86語法, AT&T 語法要更加古老,因此大多數人更加偏向于使用 Intel 的語法. nasm 編譯器支持x86語法.自從2.10版本&#xf…

MySQL 事務的底層原理和 MVCC(二)

7.2. undo 日志 7.2.1. 事務回滾的需求 我們說過事務需要保證原子性&#xff0c;也就是事務中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有時候事務執行到一半會出現一些情況&#xff0c;比如&#xff1a; 情況一&#xff1a;事務執行過程中可能遇到各種錯誤&a…

ORB-SLAM3在windows11下的編譯使用

01 寫在前面 近期在學習SLAM&#xff0c;想部署一下ORB-SLAM3&#xff0c;但是自己電腦是win11系統&#xff0c;因此就想著在win11上部署一下。但是網上看了一些教程&#xff0c;有一些博客&#xff0c;但是可能不適合我這種情況把&#xff0c;就很糾結。先說下結果&#xff0…

【python基礎(三)】操作列表:for循環、正確縮進、切片的使用、元組

文章目錄 一. 遍歷整個列表1. 在for循環中執行更多操作2. 在for循環結束后執行一些操作 二. 避免縮進錯誤三. 創建數值列表1. 使用函數range()2. 使用range()創建數字列表3. 指定步長。4. 對數字列表執行簡單的統計計算5. 列表解析 五. 使用列表的一部分-切片1. 切片2. 遍歷切片…

【并發編程】ThreadLocal詳解與原理

&#x1f4eb;作者簡介&#xff1a;小明Java問道之路&#xff0c;2022年度博客之星全國TOP3&#xff0c;專注于后端、中間件、計算機底層、架構設計演進與穩定性建設優化&#xff0c;文章內容兼具廣度、深度、大廠技術方案&#xff0c;對待技術喜歡推理加驗證&#xff0c;就職于…

【電路筆記】-電流源

電流源 文章目錄 電流源1、概述1.1 理想電流源1.2 實際電流源1.3 連接規則 2、依賴電流2.1 壓控電流源2.2 電流控制電流源 3、總結 本文為前面文章 電壓源的延續&#xff0c;我們將在本文介紹電流源。 與電壓源的情況類似&#xff0c;我們將首先介紹理想電流源的概念&#xff…