Java使用net.lingala.zip4j導(dǎo)出壓縮包文件的詳細(xì)步驟
以下是基于 zip4j 1.x 版本實現(xiàn)「加密壓縮指定文件夾 + 壓縮后刪除原文件夾」的完整代碼,兼容舊版依賴,同時解決加密、中文亂碼、文件夾刪除等核心問題:
一、先確認(rèn)依賴(Maven/Gradle)
zip4j 1.x 最新穩(wěn)定版為 1.3.2,需在 pom.xml 中引入:
<!-- zip4j 1.x 依賴(對應(yīng) core.ZipFile) -->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
二、完整實現(xiàn)代碼
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;
import java.util.Arrays;
/**
* 基于 zip4j 1.x(core.ZipFile)實現(xiàn)加密壓縮文件夾并刪除原文件夾
*/
public class ZipEncryptUtil1x {
/**
* 加密壓縮指定文件夾
* @param sourceDirPath 待壓縮文件夾路徑(如 D:\test\source)
* @param zipFilePath 壓縮包保存路徑(如 D:\test\source_encrypt.zip)
* @param password 壓縮包加密密碼
* @throws ZipException 壓縮相關(guān)異常
*/
public static void encryptCompressDir(String sourceDirPath, String zipFilePath, String password) throws ZipException {
// 1. 校驗源文件夾合法性
File sourceDir = new File(sourceDirPath);
if (!sourceDir.exists() || !sourceDir.isDirectory()) {
throw new IllegalArgumentException("源文件夾不存在或非合法目錄:" + sourceDirPath);
}
// 2. 初始化壓縮參數(shù)(加密+壓縮配置)
ZipParameters zipParams = new ZipParameters();
// 壓縮算法:DEFLATE(平衡壓縮率和速度),STORE 為無壓縮僅打包
zipParams.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 壓縮級別:0(最快)~9(最高壓縮率),5為默認(rèn)平衡值
zipParams.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 開啟加密
zipParams.setEncryptFiles(true);
// 加密方式:AES-256(推薦,比ZIP2.0更安全)
zipParams.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
// AES密鑰強度:256位(需JDK支持無限制加密策略)
zipParams.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
// 設(shè)置壓縮包密碼
zipParams.setPassword(password.toCharArray());
// 解決中文文件名亂碼(1.x 版本需手動指定字符集)
zipParams.setFileNameCharset("UTF-8");
// 3. 創(chuàng)建壓縮包并添加整個文件夾(保留目錄結(jié)構(gòu))
ZipFile zipFile = new ZipFile(zipFilePath);
// 添加文件夾到壓縮包,自動遞歸包含所有子文件/子目錄
zipFile.addFolder(sourceDir, zipParams);
System.out.println("加密壓縮完成,壓縮包路徑:" + zipFilePath);
// 4. 壓縮完成后刪除原文件夾(遞歸刪除)
boolean deleteSuccess = deleteDirectory(sourceDir);
if (deleteSuccess) {
System.out.println("原文件夾已刪除:" + sourceDirPath);
} else {
System.err.println("原文件夾刪除失?。赡芪募徽加茫? + sourceDirPath);
}
}
/**
* 遞歸刪除文件夾(包含所有子文件/子目錄)
* @param dir 待刪除的文件夾
* @return 是否刪除成功
*/
private static boolean deleteDirectory(File dir) {
if (dir.isDirectory()) {
File[] children = dir.listFiles();
// 空文件夾直接刪除
if (children == null || children.length == 0) {
return dir.delete();
}
// 遞歸刪除所有子文件/子目錄
for (File child : children) {
boolean success = child.isDirectory() ? deleteDirectory(child) : child.delete();
if (!success) {
return false;
}
}
}
// 最后刪除空文件夾
return dir.delete();
}
// 測試示例
public static void main(String[] args) {
try {
// 待壓縮文件夾路徑
String sourceDir = "D:\\test\\myFolder";
// 加密壓縮包保存路徑
String zipFile = "D:\\test\\myFolder_encrypt.zip";
// 壓縮包密碼(建議包含大小寫+數(shù)字+特殊字符)
String password = "Zip4j@123456";
// 執(zhí)行加密壓縮+刪除原文件夾
encryptCompressDir(sourceDir, zipFile, password);
} catch (Exception e) {
e.printStackTrace();
System.err.println("操作失?。? + e.getMessage());
}
}
}
三、zip4j 1.x 核心配置說明(區(qū)別于2.x)
| 配置項 | 1.x 常量值 | 說明 |
|---|---|---|
| 壓縮算法 | COMP_DEFLATE/COMP_STORE | DEFLATE(有壓縮)、STORE(無壓縮) |
| 壓縮級別 | DEFLATE_LEVEL_0~DEFLATE_LEVEL_9 | 0最快,9壓縮率最高,NORMAL=5(默認(rèn)) |
| 加密方式 | ENC_METHOD_AES/ENC_METHOD_STANDARD | AES(安全)、ZIP2.0(弱加密,不推薦) |
| AES密鑰強度 | AES_STRENGTH_128/256 | 256位需JDK解鎖無限制加密策略(JDK8及以下需替換JCE文件) |
四、關(guān)鍵問題解決
1. AES-256 加密權(quán)限問題(JDK8及以下)
若運行時報 ZipException: Invalid AES Key Strength,需替換 JDK 加密策略文件:
- 下載「JCE 無限制強度管轄權(quán)策略文件」:Oracle 官網(wǎng)
- 替換路徑:
JDK_HOME/jre/lib/security下的local_policy.jar和US_export_policy.jar - JDK9+ 已默認(rèn)支持,無需替換。
2. 中文文件名亂碼
1.x 版本需手動設(shè)置字符集:zipParams.setFileNameCharset("UTF-8"),否則壓縮包內(nèi)中文文件名會變成亂碼。
3. 文件夾刪除失敗
- 原因:文件夾內(nèi)文件被其他程序占用、權(quán)限不足;
- 解決:
// 刪除前增加權(quán)限設(shè)置+重試邏輯
private static boolean deleteDirectory(File dir) {
if (dir.isDirectory()) {
File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
// 賦予文件可寫權(quán)限
child.setWritable(true);
boolean success = deleteDirectory(child);
if (!success) {
// 重試刪除(休眠500ms)
try {
Thread.sleep(500);
success = child.delete();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
if (!success) return false;
}
}
}
}
dir.setWritable(true);
return dir.delete();
}
4. 壓縮包覆蓋問題
若目標(biāo)壓縮包已存在,1.x 版本會默認(rèn)追加文件,如需覆蓋,需先刪除已有壓縮包:
File existingZip = new File(zipFilePath);
if (existingZip.exists()) {
if (!existingZip.delete()) {
throw new ZipException("已有壓縮包無法刪除,無法覆蓋:" + zipFilePath);
}
}
// 再創(chuàng)建新壓縮包
ZipFile zipFile = new ZipFile(zipFilePath);
五、使用注意
- 壓縮包密碼建議設(shè)置復(fù)雜密碼(大小寫+數(shù)字+特殊字符),避免被暴力 破解;
- 生產(chǎn)環(huán)境中建議增加「壓縮成功校驗」(檢查壓縮包大小、完整性),再刪除原文件夾;
- 若需壓縮指定類型文件(如僅壓縮
.txt),可通過FileFilter過濾:
// 僅添加txt文件
zipFile.addFolder(sourceDir, zipParams, file -> file.getName().endsWith(".txt"));
該代碼基于 zip4j 1.x 版本(core.ZipFile)實現(xiàn),兼容舊項目依賴,可直接集成使用,核心邏輯清晰,同時處理了加密、亂碼、刪除失敗等常見問題。
以上就是Java使用net.lingala.zip4j導(dǎo)出壓縮包文件的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于Java net.lingala.zip4j導(dǎo)出壓縮包文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
超詳細(xì)講解SpringBoot參數(shù)校驗實例
經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個過程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯誤的數(shù)據(jù)等,一般需要對數(shù)據(jù)進(jìn)行校驗,下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗的相關(guān)資料,需要的朋友可以參考下2022-05-05
Java 中的進(jìn)制轉(zhuǎn)換與編碼機制詳解
在 Java 編程領(lǐng)域,進(jìn)制轉(zhuǎn)換是一項極為基礎(chǔ)且重要的技能,下面給大家介紹Java 中的進(jìn)制轉(zhuǎn)換與編碼機制,感興趣的朋友一起看看吧2025-04-04
JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法
本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法,有需要的朋友可以參考一下2013-04-04

