You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化基于zip4j的ZIP文件密码验证代码?

简化Zip4j ZIP密码验证代码

最优简化方案(利用zip4j内置验证方法)

如果使用的是zip4j 2.x及以上版本,可以直接调用内置的checkPassword方法验证密码,无需提取文件,彻底简化代码并移除Commons IO依赖:

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import java.io.File;

public class ZipPasswordValidator {
    public static void main(String[] args) {
        var fileChooser = new FileChooser();
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("zipfile", "*.zip"));
        var archive = fileChooser.showOpenDialog(null);

        if (archive == null) {
            System.out.println("No file selected");
            return;
        }

        try (ZipFile zipFile = new ZipFile(archive)) {
            if (zipFile.isEncrypted()) {
                System.out.println(correctPassword(zipFile, "cat.666"));
                System.out.println(correctPassword(zipFile, "cat_666"));
            } else {
                System.out.println("Without password");
            }
        } catch (ZipException e) {
            System.out.println("Failed to access ZIP file: " + e.getMessage());
        }
    }

    public static String correctPassword(ZipFile zipFile, String password) {
        try {
            if (zipFile.checkPassword(password.toCharArray())) {
                return password + " is correct";
            }
            return password + " is not correct";
        } catch (ZipException e) {
            return "Error verifying password '" + password + "': " + e.getMessage();
        }
    }
}

核心简化点

  • 移除冗余文件操作:直接用zip4j内置的密码验证方法,无需提取文件、创建/删除临时目录,彻底摆脱Commons IO依赖。
  • 资源自动管理:主方法使用try-with-resources创建ZipFile,自动关闭文件资源,避免资源泄漏。
  • 逻辑极度精简:去掉复杂的文件头筛选流程,密码验证逻辑直接清晰。
  • 异常处理集中化:统一处理ZipException,返回明确的错误提示,提升代码可读性。

兼容旧版zip4j(1.x版本)的简化方案

如果使用的是不支持checkPassword的旧版zip4j,可以通过尝试打开加密文件的输入流来验证密码,同样无需提取文件:

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import java.io.File;
import java.io.IOException;

public class ZipPasswordValidator {
    public static void main(String[] args) {
        var fileChooser = new FileChooser();
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("zipfile", "*.zip"));
        var archive = fileChooser.showOpenDialog(null);

        if (archive == null) {
            System.out.println("No file selected");
            return;
        }

        try (ZipFile zipFile = new ZipFile(archive)) {
            if (zipFile.isEncrypted()) {
                System.out.println(correctPassword(zipFile, "cat.666"));
                System.out.println(correctPassword(zipFile, "cat_666"));
            } else {
                System.out.println("Without password");
            }
        } catch (ZipException e) {
            System.out.println("Failed to access ZIP file: " + e.getMessage());
        }
    }

    public static String correctPassword(ZipFile zipFile, String password) {
        try {
            zipFile.setPassword(password.toCharArray());
            // 尝试打开第一个加密文件的输入流验证密码
            return zipFile.getFileHeaders().stream()
                    .filter(fileHeader -> fileHeader.isEncrypted())
                    .findFirst()
                    .map(fileHeader -> {
                        try {
                            zipFile.getInputStream(fileHeader).close();
                            return password + " is correct";
                        } catch (IOException | ZipException e) {
                            return password + " is not correct";
                        }
                    })
                    .orElse("No encrypted files found in ZIP archive");
        } catch (ZipException e) {
            return "Error verifying password '" + password + "': " + e.getMessage();
        }
    }
}

内容的提问来源于stack exchange,提问作者Michal Rama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:53:10