目次
ZIPファイルとは

ZIPとは、データ圧縮やアーカイブのフォーマットのことです。
ZIPは主に、Windowsでよく使用されるフォーマットとなっています。
JavaのZipOutputStreamクラスについて
JavaでZIPファイルを圧縮するには、「ZipOutputStreamクラス」を使います。
ZipOutputStreamクラスは、ファイルをZIPファイル形式で書き込む用の出力ストリーム・フィルタを実装するクラスです。
また、圧縮データと圧縮解除データの両方をサポートします。
JavaでZIPファイルに圧縮する方法

では、Javaで指定フォルダをZIPファイルに圧縮する方法を見ていきましょう。
サンプルコードは下記の通りです。
■記述例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Main {
public static void main(String[] args) throws Exception {
File zipFile = new File("CompressedFile.zip");
System.out.println(
"ZIPファイルに圧縮する前の存在を確認:" + zipFile.exists());
ZipOutputStream zostr = new ZipOutputStream(
new FileOutputStream(zipFile));
File targetFile = new File("Sample");
Main.compressFile(zostr, targetFile);
zostr.close();
System.out.println("ZIPファイルに圧縮した後の存在を確認: " + zipFile.exists());
}
public static void compressFile(ZipOutputStream zostr, File file) throws Exception {
byte[] buf = new byte[1024];
int len;
if (file.isDirectory()) {
zostr.putNextEntry(new ZipEntry(file.getPath() + "/"));
File[] childFileList = file.listFiles();
for (File childFile: childFileList) {
compressFile(zostr, childFile);
}
} else {
zostr.putNextEntry(new ZipEntry(file.getPath()));
BufferedInputStream bistr = new BufferedInputStream(new FileInputStream(file));
while ((len = bistr.read(buf, 0, buf.length)) != -1) {
zostr.write(buf, 0, len);
}
bistr.close();
zostr.closeEntry();
}
}
}
また、フォルダ構成は下記の通りです。

Main.javaと同ディレクトリに、ZIPファイルに圧縮したいフォルダ・ファイルを格納します。
圧縮処理を行っているのは compressFile関数です。
ZipOutputStreamクラスの putNextEntryメソッド で、新しいZIPファイル・エントリの書込みを開始し、エントリ・データの開始位置にストリームを配置しています。
圧縮する対象がディレクトリである時は、ディレクトリ名の最後に「/」を追加した値をエントリ名に設定する流れです。
そして、圧縮するファイルの内容を読み込んだ上で、ZipOutputStreamクラスの writeメソッド で、バイト配列を現在のZIPエントリ・データに書き込みます。
すべての内容の書き込みが完了したら、読み込み元のストリームを閉じ、ZipOutputStreamクラスの closeEntryメソッド で現在のZIPエントリを閉じます。
この処理を、ZIPファイルとして圧縮するファイルの数だけ繰り返します。

上記のプログラムを実行すると、同ディレクトリに CompressedFile.zip が作成でき、ファイル・フォルダの圧縮ができているはずです。
複数ファイルをZIP圧縮するには?
今回の例で言うと、複数のファイルを圧縮する場合は targetFile を追加すればOKです。
こちらもサンプルコードと結果を紹介します。
■記述例
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Main {
public static void main(String[] args) throws Exception {
File zipFile = new File("CompressedFile.zip");
System.out.println(
"ZIPファイルに圧縮する前の存在を確認:" + zipFile.exists());
ZipOutputStream zostr = new ZipOutputStream(
new FileOutputStream(zipFile));
File targetFile = new File("Sample01");
Main.compressFile(zostr, targetFile);
File targetFile02 = new File("Sample02");
Main.compressFile(zostr, targetFile02);
zostr.close();
System.out.println("ZIPファイルに圧縮した後の存在を確認: " + zipFile.exists());
}
public static void compressFile(ZipOutputStream zostr, File file) throws Exception {
byte[] buf = new byte[1024];
int len;
if (file.isDirectory()) {
zostr.putNextEntry(new ZipEntry(file.getPath() + "/"));
File[] childFileList = file.listFiles();
for (File childFile: childFileList) {
compressFile(zostr, childFile);
}
} else {
zostr.putNextEntry(new ZipEntry(file.getPath()));
BufferedInputStream bistr = new BufferedInputStream(new FileInputStream(file));
while ((len = bistr.read(buf, 0, buf.length)) != -1) {
zostr.write(buf, 0, len);
}
bistr.close();
zostr.closeEntry();
}
}
}
■フォルダ構成

■実行結果

実行結果のように、2つのフォルダ・ファイルが CompressedFile.zip として圧縮できました。
JavaでZIPファイルを解凍する方法

次に、JavaでZIPファイルを解凍する方法を紹介します。
サンプルコードは下記の通りです。
■記述例
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Main {
public static void main(String[] args) throws Exception {
byte[] buf = new byte[1024];
int len;
File zipFile = new File("CompressedFile.zip");
ZipInputStream zistr = new ZipInputStream(
new FileInputStream(zipFile));
ZipEntry zipEntry = null;
while ((zipEntry = zistr.getNextEntry()) != null) {
File uncompressFile = new File(zipEntry.getName());
if (zipEntry.isDirectory()) {
uncompressFile.mkdirs();
} else {
BufferedOutputStream bostr = new BufferedOutputStream(new FileOutputStream(uncompressFile));
while ((len = zistr.read(buf)) != -1) {
bostr.write(buf, 0, len);
}
bostr.close();
}
}
zistr.close();
System.out.println("ZIPファイルの解凍が完了しました");
}
}
また、フォルダの構成は下記のようになっています。
■フォルダ構成

この状態でプログラムを実行すると、下記のように中身のフォルダ・ファイルが解凍されるはずです。
■実行結果

このZIP形式で圧縮されたファイルをZIPファイルと呼びます。