1. 概要

前のチュートリアルでは、 java.util.zip パッケージを使用して、Javazipおよび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標準暗号化を使用する場合は、AESZIP_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にあります。