zip4j を使用してパスワード付きZIPの生成・解凍する方法について記載します。
目次
パスワード付きZIPを生成する方法
ファイルを指定
addFileメソッドに、ZipParameters を指定することでパスワード付きZIPファイルを生成することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 圧縮用パラメーター ZipParameters zipParameters = new ZipParameters(); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD); try { String outputPath = "/root/output/sample.zip"; String password = "p123"; // ZipFileインスタンスを生成します。 // コンストラクタの引数に、"出力先" と "パスワード" を指定します。 ZipFile zipFile = new ZipFile(outputPath, password.toCharArray()); // 圧縮するファイルをパスで指定 String inputPath = "/root/input/text.txt"; zipFile.addFile(inputPath, zipParameters); } catch (ZipException ze) { // 例外処理 } |
また、入力ファイルをFileオブジェクトとして指定することもできます。
1 2 3 |
File inputFile = new File("/root/input/text.txt"); zipFile.addFile(inputFile, zipParameters); |
圧縮用パラメーター には AES などの暗号化方式を指定することもできます。AESを使用する場合は、ZipParametersを次のようにします。
1 2 3 4 |
ZipParameters zipParameters = new ZipParameters(); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(EncryptionMethod.AES); zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256); |
一つ気をつけなければいけないことは、AES-256で暗号化した場合、Macのターミナルから解凍することが出来ませんでした(unzipコマンド)。
そのため、圧縮したプログラム以外のアプリから解凍する必要がある場合は、暗号化方式は EncryptionMethod.ZIP_STANDARD にした方がいいと思われます。
複数ファイルを一括で指定する方法
addFilesメソッドを使用することで、複数ファイルを一括で指定することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 圧縮用パラメーター ZipParameters zipParameters = new ZipParameters(); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD); try { // ZipFileインスタンスの生成 // コンストラクタに出力先、パスワードを指定 String outputPath = "/root/output/sample.zip"; String password = "p123"; ZipFile zipFile = new ZipFile(outputPath, password.toCharArray()); // 圧縮するファイルのリストを作成 File inputFile1 = new File("/root/input/text1.txt"); File inputFile2 = new File("/root/input/text2.txt"); List<File> inputFiles = Arrays.asList(inputFile1, inputFile2); // 圧縮実行 zipFile.addFiles(inputFiles, zipParameters); } catch (ZipException ze) { // 例外処理 } |
フォルダを指定する方法
addFolderメソッドを使用すると、ルートフォルダを指定して圧縮することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
try { // ZipFIleインスタンスの生成(コンストラクタに出力先・パスワードを指定) String outputPath = "/output/sample.zip"; String password = "p123"; ZipFile zipFile = new ZipFile(outputPath, password.toCharArray()); // inputフォルダをルートに圧縮する File inputDir = new File("/root/input"); zipFile.addFolder(inputDir, zipParameters); } catch (ZipException ze) { // 例外処理 } |
ZIPを解凍する方法
ZIPファイル内の全てのファイルを取り出す方法
extractAll メソッドを使用すると全てのファイルを取り出すことができます。
1 2 3 4 5 6 7 8 9 |
try { String zipFilePath = "/root/input/sample.zip"; String password = "p123"; String outputPath = "/root/output"; new ZipFile(zipFilePath, password.toCharArray()).extractAll(outputPath); } catch (ZipException ze) { // 例外処理 } |
ZIPファイル内の指定したファイルのみ取り出す方法
extractFile メソッドを使用すると、指定したファイルのみ取り出すことができます。
1 2 3 4 5 6 7 8 9 10 11 |
try { String zipFilePath = "/root/input/sample.zip"; String password = "p123"; String targetFileName = "text1.txt"; String outputPath = "/root/output"; new ZipFile(zipFilePath, password.toCharArray()) .extractFile(targetFileName, outputPath); } catch (ZipException ze) { // 例外処理 } |
まとめ
zip4j を使用すると、簡単にパスワード付きZIPファイルの生成・解凍を行うことができました。
注意する点は、圧縮パラメーターの暗号化方法の指定(setEncryptionMethod)については、指定した方式で圧縮したZIPファイルが必要な環境で解凍できるか確認する必要があります。
Macのターミナルでは、次のような結果になりました。
・EncryptionMethod.ZIP_STANDARD :解凍成功
・EncryptionMethod.AES:解凍失敗