最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用net.lingala.zip4j導(dǎo)出壓縮包文件的詳細(xì)步驟

 更新時間:2026年01月09日 09:52:35   作者:hellotutu  
本文介紹了如何使用zip4j1.x版本實現(xiàn)加密壓縮指定文件夾并刪除原文件夾的功能,解決了AES-256加密權(quán)限問題、中文亂碼和文件夾刪除失敗等核心問題,代碼兼容舊版依賴,核心配置清晰,并附帶了詳細(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_STOREDEFLATE(有壓縮)、STORE(無壓縮)
壓縮級別DEFLATE_LEVEL_0~DEFLATE_LEVEL_90最快,9壓縮率最高,NORMAL=5(默認(rèn))
加密方式ENC_METHOD_AES/ENC_METHOD_STANDARDAES(安全)、ZIP2.0(弱加密,不推薦)
AES密鑰強度AES_STRENGTH_128/256256位需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.jarUS_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);

五、使用注意

  1. 壓縮包密碼建議設(shè)置復(fù)雜密碼(大小寫+數(shù)字+特殊字符),避免被暴力 破解;
  2. 生產(chǎn)環(huán)境中建議增加「壓縮成功校驗」(檢查壓縮包大小、完整性),再刪除原文件夾;
  3. 若需壓縮指定類型文件(如僅壓縮 .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ù)校驗實例

    超詳細(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 中的進(jìn)制轉(zhuǎn)換與編碼機制詳解

    在 Java 編程領(lǐng)域,進(jìn)制轉(zhuǎn)換是一項極為基礎(chǔ)且重要的技能,下面給大家介紹Java 中的進(jìn)制轉(zhuǎn)換與編碼機制,感興趣的朋友一起看看吧
    2025-04-04
  • Java日常練習(xí)題,每天進(jìn)步一點點(8)

    Java日常練習(xí)題,每天進(jìn)步一點點(8)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • idea中JRebel不生效問題及解決方案

    idea中JRebel不生效問題及解決方案

    這篇文章主要介紹了idea中JRebel不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 手把手教你排查解決Java編譯報錯:找不到符號

    手把手教你排查解決Java編譯報錯:找不到符號

    這篇文章主要介紹了手把手教你排查解決Java編譯報錯:找不到符號的相關(guān)資料,提供了排查步驟和解決方法,通過這些步驟,開發(fā)者可以有效地找到并解決編譯器拋出的找不到符號錯誤,從而提高開發(fā)效率,需要的朋友可以參考下
    2025-04-04
  • JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析

    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)行較簡潔的雙括弧初始化的方法

    在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法

    本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法,有需要的朋友可以參考一下
    2013-04-04
  • J2ME編程中的幾個重要概念介紹

    J2ME編程中的幾個重要概念介紹

    本文介紹的是J2ME編程應(yīng)用平臺中的幾個重要概念,希望對你有幫助,一起來看。
    2015-09-09
  • MyBatis中的properties配置(推薦)

    MyBatis中的properties配置(推薦)

    這篇文章給大家介紹了MyBatis中的properties配置,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-12-12
  • 老生常談java數(shù)組中的常見異常

    老生常談java數(shù)組中的常見異常

    數(shù)組是用來存儲一系列數(shù)據(jù),但它往往被認(rèn)為是一系列相同類型的變量,異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的,接下來讓我們詳細(xì)的了解吧
    2022-03-03

最新評論

侯马市| 南投县| 孝昌县| 五华县| 新乡市| 怀柔区| 岳阳市| 南涧| 林州市| 阳春市| 女性| 淮滨县| 宁陵县| 德昌县| 通山县| 阿图什市| 洪江市| 静安区| 湟源县| 漠河县| 两当县| 苍梧县| 荣成市| 沅江市| 靖边县| 乌兰察布市| 宁波市| 富源县| 泸溪县| 班玛县| 遵义市| 泰和县| 财经| 汉寿县| 嘉黎县| 梧州市| 道孚县| 清苑县| 多伦县| 临洮县| 于田县|