ZIP圧縮を行うには(標準ライブラリ編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:ファイル操作

ZIP圧縮を行うには(標準ライブラリ編)

【概要】

PROCESSINGはJavaをベースにした言語ですので、Javaの機能を利用してZIP圧縮を行うことが可能です。

ただしJavaの標準機能(標準ライブラリ)では、パスワード付きのZIPファイルを作成することができません。また圧縮方式にZipCrypto(Zip2.0暗号方式)を採用していますが、この圧縮方式には既に脆弱性が発見されています。

おまけにJavaの標準機能(標準ライブラリ)では、圧縮方式にZipCrypto以外を選択することができません!。

そもそもZIP圧縮では、解凍用のパスワードを知らなくても圧縮されたファイル名を見ることができてしまいます。前述の件も考慮すると、セキュリティの確保が重要な場面では、極力ZIPファイルは利用しない事をお勧めします。

それでも手軽に利用できるのがZIPファイルの強みですので、セキュリティよりも利便性を重視する場合には、利用価値があります。

少しでも暗号強度を高めた(暗号化方式にAESを採用した)ZIPファイルを作成する場合や、パスワード付きのZIPファイルを作成したい場合は、標準ライブラリではなく、zip4j ライブラリを利用するのが良いでしょう。

zip4jを使った圧縮方法については「ZIP圧縮を行うには(zip4j編)」を参照してください。

ただしWindowsが標準でサポートしているZIP圧縮解凍機能では、AESで暗号化されたZIPファイルは解凍する事ができない事に注意してください。

詳しくは下記サイト様などが参考となります。

本記事では、Javaの標準ライブラリ(java.util.zip)を用いたZIP圧縮方法について紹介します。

 

【詳細】

ZIP圧縮を行うには

  • 圧縮後のファイル名を元にして、ZipOutputStreamを作成
  • ZipOutputStreamに、ZipEntryを追加
  • 圧縮する
  • ZipEntryとZipOutputStreamをcloseする

という手順で処理を行います。

以下、順番に説明をします。

 

ZipOutputStreamを作成

ZipOutputStreamは、ZIPファイルの生成(圧縮)を行う基本となるクラスです。圧縮後のファイル名を元にOutputStreamを作成し、それを与えることでインスタンスを作成します。

ZipOutputStreamを作成ZipOutputStream zos = new ZipOutputStream(OutputStream out);
ZipOutputStream zos = new ZipOutputStream(OutputStream out, Charset charset);

zos:作成したZipOutputStream インスタンス
out:出力対象となる圧縮後のファイルストリーム
charset:エントリ名とコマンドに使用する文字コード

ポイントは文字コードの指定です。

圧縮後のファイルを(日本版)Windowsで利用するなら、日本語名を含むファイルやフォルダを圧縮する場合は、文字コードに「Shift_JIS」または「MS932(windows-31j)」を指定するのが無難です。

なぜなら(日本版)Windowsでは、ZIPファイルに含まれるファイル名やフォルダ名はMS932(windows-31j)である事がデフォルトとなっているからです。

その一方で圧縮後のファイルをMacやLinuxで利用するなら、文字コードに「UTF-8」を指定しましょう。

例えば上記のようになります。Charsetで指定可能な文字コードについては、公式ドキュメント を参照してください。

 

ZipEntryを追加

作成したZipOutputStreamに、圧縮対象となるファイルのエントリー情報を追加します。

エントリーはZipEntryクラスのインスタンスとして生成し、ZipOutputStreamのputNextEntry()メソッドで追加します。

ZipEntryを作成ZipEntry entry = new ZipEntry(String name);

entry:エントリー情報
name:エントリー名

.

ZipEntryを追加void zos.putNextEntry(ZipEntry entry);

entry:エントリー情報
zos:ZipOutputStream

その後、エントリーに圧縮する内容(圧縮対象ファイルの中身)を書き込み、ZipOutputStreamのcloseEntry()メソッドで閉じます。

追加するエントリー名は、通常は圧縮対象のファイル名になります。

例えば上記のような感じです。この場合、「fuga.txt」が圧縮対象ファイルで、そのエントリー名は「fuga.txt」になります。

上記の手順で出来上がるZIPファイルは、以下のようになります。


上記は圧縮したZIPファイルを、解凍ツールで見た様子です。指定したエントリー名(ファイル名)で圧縮されているのがわかりますね。

例えばエントリー名を

のようにすると


こうなります。当然ですが、このZIPファイルを解凍すると「uho」というファイルが出来上がることになるので注意してください。

 

圧縮する

エントリーを追加しただけでは、ファイルは圧縮されません。

エントリーを追加した後で、圧縮対象ファイルの中身を読みだしてZipOutputStreamに書き込む必要があります。

ファイルを全て書き込んだら、追加したZipEntryエントリーをcloseします。また、さらに新しいエントリーを追加する必要がなくなったなら、ZipOutputStreamもcloseします。

単一のファイル(この場合は hoge.txtファイル)を書き込む例は上記のようになります。上記例で、zosはZipOutputStreamのインスタンス変数です。あとはJavaの標準的なクラスですので、難しいことはないと思います。

これで指定したフォルダにZIPファイルが出来上がります。

なお上記は、シンプルに単一ファイルを圧縮する例です。指定フォルダ配下の全てのファイルとフォルダを圧縮するなど、より実用的な処理を行うためには、ファイル一覧を取得しながら圧縮するなどの工夫が必要となります。

より具体的な例は、下記サンプルを参照してください。

 

【関連記事】

 


サンプルプログラム

フォルダ配下を圧縮する例:

上記はTech-Blog 様に掲載されていたプログラムを改編して掲載しています。

以下のような状態のフォルダで、c:\temp 配下を圧縮しています。

<出力サンプル>
以下は出来上がった圧縮ファイルの様子です。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。