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ファイルと呼びます。