如何简化基于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
相关产品推荐
相关产品推荐

