java.util.zipパッケージはZIPやGZIPのファイル圧縮、伸長やCRC等のチェックサムを扱う機能があります。ZIPはWindowsではWinZipに代表されるようにファイル群の圧縮とアーカイブを行うことができるファイル形式です。GZIPはGNUプロジェクトで開発された単一ファイルの圧縮形式です(名前が似ていますがZIPとGZIPは別の形式です)。Javaのプログラムからファイルの圧縮、伸長が行えてなかなか便利です。残念ながら日本国内でよく用いられているLZH形式には対応していません。
単にzip形式のファイルの伸長、展開を行うにはjava.util.zip.ZipFile
クラスとjava.util.zip.ZipEntry
クラスだけで事足ります。例えば、/tmp/sample.zipというファイルがあったとして、これをカレントディレクトリ以下に伸長、展開するには、
// まずZipFileオブジェクトを作成します
File dir = new File(".");
File file = new File("/tmp/sample.zip");
ZipFile zipfile = new ZipFile(file);
// zipファイル内の各エントリを見ます
Enumeration enum = zipfile.entries();
while (enum.hasMoreElements()) {
ZipEntry entry = (ZipEntry) enum.nextElement();
// 伸長するファイルの名前と取り出します。
String name = entry.getName();
// 出力先のファイルを用意します。
File outputfile = new File(dir, name);
FileOutputStream out = new FileOutputStream(outputfile);
// エントリのストリームを取り出します。
InputStream in = zipfile.getInputStream(entry);
// エントリから出力先にバイト列をコピーします。
byte[] buffer = new byte[512];
int size = 0;
while ((size = in.read(buffer)) > 0) {
out.write(buffer, 0, size);
}
// ストリームを閉じます
out.close();
in.close();
}
で完了です。
ZipEntryからはファイルの名前の他に、圧縮前のサイズ、圧縮された状態のサイズ、コメント、最終更新時刻、CRC-32のチェックサム値を採ることができます。
ZipFileは読み出し専用のオブジェクトですので、zipファイルを作成するにはZipOutputStreamクラスを使う必要があります。