パスワードで保護されたZipファイルを作成してJavaで解凍する方法
1. 概要
前のチュートリアルでは、 java.util.zip パッケージを使用して、Javaでzipおよびunzipする方法を示しました。 ただし、パスワードで保護されたzipファイルを作成するための標準のJavaライブラリはありません。
このチュートリアルでは、パスワードで保護されたzipファイルを作成し、Zip4jライブラリを使用してそれらを解凍する方法を学習します。 これは、zipファイル用の最も包括的なJavaライブラリです。
2. 依存関係
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);
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFile(new File("aFile.txt"), zipParameters);
setCompressionLevel行はオプションです。 レベルFASTESTからULTRAまで選択できます(デフォルトは NORMAL です)。
この例では、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. 複数のファイルをZipする
一度に複数のファイルを圧縮できるように、コードを少し変更してみましょう。
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()メソッドを使用して、compressed.zipからすべてのファイルを抽出できます。
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractAll("/destination_directory");
8. 単一ファイルの抽出
また、 compressed.zip から1つのファイルを抽出するだけの場合は、 extractFile()メソッドを使用できます。
ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractFile("aFile.txt", "/destination_directory");
9. 結論
要約すると、パスワードで保護されたzipファイルを作成し、Zip4jライブラリを使用してJavaでそれらを解凍する方法を学びました。
これらの例の実装は、GitHubのにあります。