JDK自带的java.util.zip 包中的 ZipInputStream 不直接支持密码保护的 ZIP 文件。你可以使用第三方库来处理带密码的 ZIP 文件,常用的库是Zip4j。
引入Zip4j依赖
Zip4j 是一个功能强大的库,支持处理加密的 ZIP 文件。首先,你需要将 Zip4j 库添加到你的项目中。假设你在使用Maven,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
使用 Zip4j 解压带密码的 ZIP 文件
以下是一个使用 Zip4j 解压带密码的 ZIP 文件的示例代码:
/**
* 使用给定密码解压 ZIP 文件
*
* @param zipFilePath ZIP 文件路径
* @param destDirectory 解压目标目录
* @param password ZIP 文件密码
* @throws IOException
*/
public static void unzipWithPassword(String zipFilePath, String destDirectory, String password) throws IOException {
File destDir = new File(destDirectory);
if (!destDir.exists()) {
destDir.mkdir();
}
ZipFile zipFile = new ZipFile(zipFilePath);
if (zipFile.isEncrypted()) {
if(StringUtils.isNotBlank(password)){
zipFile.setPassword(password.toCharArray());
}else{
throw new ZipException("Zip file is encrypted, but no password was given.");
}
}
zipFile.extractAll(destDirectory);
}
使用 Zip4j 来压缩目录
以下是一个示例代码,展示了如何使用 Zip4j 来压缩目录,并选择性地设置密码保护:
/**
* 压缩文件夹
* @param sourceDirectoryPath 需要压缩的目录路径
* @param zipFilePath 生成的 ZIP 文件路径
* @param password 可选的密码,用于加密 ZIP 文件
* @throws ZipException
*/
public static void compressDirectory(String sourceDirectoryPath, String zipFilePath, String password) throws ZipException {
ZipFile zipFile = new ZipFile(zipFilePath);
// 设置压缩参数
ZipParameters zipParameters = new ZipParameters();
zipParameters.setCompressionLevel(CompressionLevel.FASTEST); // 设置压缩级别
zipParameters.setIncludeRootFolder(false); // 不包括根目录
if (StringUtils.isNotBlank(password)) {
zipParameters.setEncryptFiles(true); // 启用文件加密
zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD); //设置加密方法
zipFile.setPassword(password.toCharArray()); // 设置密码
}
File sourceDir = new File(sourceDirectoryPath);
zipFile.addFolder(sourceDir, zipParameters);
}