河南群鑫法律咨询贾老师 發表於 2026-1-9 09:52:35

Java使用net.lingala.zip4j导出压缩包文件的详细步骤

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、先确认依赖(Maven/Gradle)</li><li>二、完整实现代码</li><li>三、zip4j 1.x 核心配置说明(区别于2.x)</li><li>四、关键问题解决</li><ul class="second_class_ul"><li>1. AES-256 加密权限问题(JDK8及以下)</li><li>2. 中文文件名乱码</li><li>3. 文件夹删除失败</li><li>4. 压缩包覆盖问题</li></ul><li>五、使用注意</li><ul class="second_class_ul"></ul></ul></div><p>以下是基于 zip4j 1.x 版本实现「加密压缩指定文件夹 + 压缩后删除原文件夹」的完整代码,兼容旧版依赖,同时解决加密、中文乱码、文件夹删除等核心问题:</p>
<p class="maodian"></p><h2>一、先确认依赖(Maven/Gradle)</h2>
<p>zip4j 1.x 最新稳定版为 <code>1.3.2</code>,需在 <code>pom.xml</code> 中引入:</p>
<div class="jb51code"><pre class="brush:xml;">&lt;!-- zip4j 1.x 依赖(对应 core.ZipFile) --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;net.lingala.zip4j&lt;/groupId&gt;
    &lt;artifactId&gt;zip4j&lt;/artifactId&gt;
    &lt;version&gt;1.3.2&lt;/version&gt;
&lt;/dependency&gt;
</pre></div>
<p class="maodian"></p><h2>二、完整实现代码</h2>
<div class="jb51code"><pre class="brush:java;">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)实现加密压缩文件夹并删除原文件夹
*/
public class ZipEncryptUtil1x {

    /**
   * 加密压缩指定文件夹
   * @param sourceDirPath 待压缩文件夹路径(如 D:\test\source)
   * @param zipFilePath   压缩包保存路径(如 D:\test\source_encrypt.zip)
   * @param password      压缩包加密密码
   * @throws ZipException 压缩相关异常
   */
    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. 初始化压缩参数(加密+压缩配置)
      ZipParameters zipParams = new ZipParameters();
      // 压缩算法:DEFLATE(平衡压缩率和速度),STORE 为无压缩仅打包
      zipParams.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
      // 压缩级别:0(最快)~9(最高压缩率),5为默认平衡值
      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);
      // 设置压缩包密码
      zipParams.setPassword(password.toCharArray());
      // 解决中文文件名乱码(1.x 版本需手动指定字符集)
      zipParams.setFileNameCharset("UTF-8");

      // 3. 创建压缩包并添加整个文件夹(保留目录结构)
      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";
            // 压缩包密码(建议包含大小写+数字+特殊字符)
            String password = "Zip4j@123456";

            // 执行加密压缩+删除原文件夹
            encryptCompressDir(sourceDir, zipFile, password);
      } catch (Exception e) {
            e.printStackTrace();
            System.err.println("操作失败:" + e.getMessage());
      }
    }
}
</pre></div>
<p class="maodian"></p><h2>三、zip4j 1.x 核心配置说明(区别于2.x)</h2>
<table><thead><tr><th>配置项</th><th>1.x 常量值</th><th>说明</th></tr></thead><tbody><tr><td>压缩算法</td><td><code>COMP_DEFLATE</code>/<code>COMP_STORE</code></td><td>DEFLATE(有压缩)、STORE(无压缩)</td></tr><tr><td>压缩级别</td><td><code>DEFLATE_LEVEL_0</code>~<code>DEFLATE_LEVEL_9</code></td><td>0最快,9压缩率最高,<code>NORMAL</code>=5(默认)</td></tr><tr><td>加密方式</td><td><code>ENC_METHOD_AES</code>/<code>ENC_METHOD_STANDARD</code></td><td>AES(安全)、ZIP2.0(弱加密,不推荐)</td></tr><tr><td>AES密钥强度</td><td><code>AES_STRENGTH_128</code>/<code>256</code></td><td>256位需JDK解锁无限制加密策略(JDK8及以下需替换JCE文件)</td></tr></tbody></table>
<p class="maodian"></p><h2>四、关键问题解决</h2>
<p class="maodian"></p><h3>1. AES-256 加密权限问题(JDK8及以下)</h3>
<p>若运行时报 <code>ZipException: Invalid AES Key Strength</code>,需替换 JDK 加密策略文件:</p>
<ul><li>下载「JCE 无限制强度管辖权策略文件」:Oracle 官网</li><li>替换路径:<code>JDK_HOME/jre/lib/security</code> 下的 <code>local_policy.jar</code> 和 <code>US_export_policy.jar</code></li><li>JDK9+ 已默认支持,无需替换。</li></ul>
<p class="maodian"></p><h3>2. 中文文件名乱码</h3>
<p>1.x 版本需手动设置字符集:<code>zipParams.setFileNameCharset(&quot;UTF-8&quot;)</code>,否则压缩包内中文文件名会变成乱码。</p>
<p class="maodian"></p><h3>3. 文件夹删除失败</h3>
<ul><li>原因:文件夹内文件被其他程序占用、权限不足;</li><li>解决:</li></ul>
<div class="jb51code"><pre class="brush:java;">// 删除前增加权限设置+重试逻辑
private static boolean deleteDirectory(File dir) {
    if (dir.isDirectory()) {
      File[] children = dir.listFiles();
      if (children != null) {
            for (File child : children) {
                // 赋予文件可写权限
                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();
}
</pre></div>
<p class="maodian"></p><h3>4. 压缩包覆盖问题</h3>
<p>若目标压缩包已存在,1.x 版本会默认追加文件,如需覆盖,需先删除已有压缩包:</p>
<div class="jb51code"><pre class="brush:java;">File existingZip = new File(zipFilePath);
if (existingZip.exists()) {
    if (!existingZip.delete()) {
      throw new ZipException("已有压缩包无法删除,无法覆盖:" + zipFilePath);
    }
}
// 再创建新压缩包
ZipFile zipFile = new ZipFile(zipFilePath);
</pre></div>
<p class="maodian"></p><h2>五、使用注意</h2>
<ol><li>压缩包密码建议设置复杂密码(大小写+数字+特殊字符),避免被暴力 破解;</li><li>生产环境中建议增加「压缩成功校验」(检查压缩包大小、完整性),再删除原文件夹;</li><li>若需压缩指定类型文件(如仅压缩 <code>.txt</code>),可通过 <code>FileFilter</code> 过滤:</li></ol>
<div class="jb51code"><pre class="brush:java;">// 仅添加txt文件
zipFile.addFolder(sourceDir, zipParams, file -&gt; file.getName().endsWith(".txt"));
</pre></div>
<p>该代码基于 zip4j 1.x 版本(<code>core.ZipFile</code>)实现,兼容旧项目依赖,可直接集成使用,核心逻辑清晰,同时处理了加密、乱码、删除失败等常见问题。</p>
<p>以上就是Java使用net.lingala.zip4j导出压缩包文件的详细步骤的详细内容,更多关于Java net.lingala.zip4j导出压缩包文件的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Java下载图片并导出压缩包的实现步骤</li><li>Java纯代码实现导出文件为压缩包</li><li>Java如何把文件夹打成压缩包并导出</li><li>Java实现导出ZIP压缩包的方法</li><li>Java多文件以ZIP压缩包导出的实现方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Java使用net.lingala.zip4j导出压缩包文件的详细步骤