1. 概述
在之前的教程中,我们学习了如何使用 java.util.zip 完成文件的压缩和解压,但不支持加密。
本文我们将学习如何 使用Zip4j 创建受密码保护的 zip 文件。
2. Maven 依赖
让我们首先将 zip4j 依赖项添加到 pom.xml 文件中:
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.9.0</version>
</dependency>
3. 压缩文件
首先, 我们将使用 ZipFile addFile() 方法 将名为 aFile.txt 的文件压缩到名为 compressed.zip 的受密码保护的压缩包中:
ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
// 设置压缩级别,范围从FASTEST到ULTRA,默认为NORMAL
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
// 设置加密方式
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFile(new File("aFile.txt"), zipParameters);
setCompressionLevel 行是可选的,用于设置压缩级别。
本例中,我们使用了 AES 加密。如果我们想使用 Zip 标准加密,我们只需将 AES 替换为 ZIP_STANDARD 即可。
请注意, 如果磁盘上不存在文件“aFile.txt”,该方法将抛出异常: “net.lingala.zip4j.exception.ZipException:文件不存在:...”
为了解决这个问题,我们必须确保该文件是手动创建的并放置在项目文件夹中,或者我们必须从 Java 创建它:
File fileToAdd = new File("aFile.txt");
if (!fileToAdd.exists()) {
fileToAdd.createNewFile();
}
另外,在我们完成新的 ZipFile 后, 关闭资源是一个很好的做法:
zipFile.close();
4. 压缩多个文件
让我们稍微修改一下代码,以便我们可以一次压缩多个文件:
ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
List<File> filesToAdd = Arrays.asList(
new File("aFile.txt"),
new File("bFile.txt")
);
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFiles(filesToAdd, zipParameters);
我们不使用 addFile 方法,而是 使用 addFiles() 并传入文件 列表 。
5. 压缩文件夹
我们只需将 addFile 方法替换为 addFolder 即可压缩文件夹:
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFolder(new File("/users/folder_to_add"), zipParameters);
6. 分卷压缩 Zip 文件
对于大文件, 我们可以使用 createSplitZipFile 和 createSplitZipFileFromFolder 方法将 zip 文件拆分为多个文件:
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
int splitLength = 1024 * 1024 * 10; //10MB
zipFile.createSplitZipFile(Arrays.asList(new File("aFile.txt")), zipParameters, true, splitLength);
zipFile.createSplitZipFileFromFolder(new File("/users/folder_to_add"), zipParameters, true, splitLength);
splitLength 的单位是字节。
7. 提取所有文件
提取文件也同样简单。我们可以使用 extractAll() 方法从 压缩的.zip 中提取所有文件:
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractAll("/destination_directory");
8. 提取单个文件
如果我们只想从 压缩的.zip 中提取单个文件,我们可以使用 extractFile() 方法:
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractFile("aFile.txt", "/destination_directory");
9. 总结
总之,我们学习了 如何创建受密码保护的 zip 文件并使用 Zip4j 库在 Java 中解压缩它们 。
这些示例的实现可以在 GitHub 上找到。