今回はJavaで用意されている標準クラスのライブラリを使って、Zipファイル圧縮を行う方法を紹介します。
標準クラスのライブラリ参照の記述は必要ですが、比較的簡単にできるのでぜひZipファイル圧縮の実装方法を知っていただきたいと思います。
なお、今回作成したJavaプロジェクトは、mainメソッドを持つ一般的なプロジェクトを作成し、動作を確認しました。
必要なパッケージのインポート
まずは、Zipファイルに圧縮するコードを書く前に、必要な標準クラスライブラリをインポートしておきましょう。
次の標準クラスをインポートしておくと、Zipファイル圧縮のコードを書くことが出来るようになります。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
最初の3つはファイル入出力に関するものですが、残りの2つにはzipという名前が確認できます。
この2つの標準クラスにZipファイルの圧縮、解凍に関する処理が定義されています。
ファイルをZip圧縮するメソッドを定義
では、実際にファイルを圧縮する処理をJavaで書いてみましょう。
Javaでファイル圧縮処理を書く場合は、以下のようなコードを書くことでファイルの圧縮処理を行うことが出来ます。
//ファイルを圧縮する(ファイル複数を圧縮)
public static void archiveZipMul() {
//圧縮前のファイル
String[] originFiles = {"fruits.csv", "vegitable.csv","grain.csv"};
//圧縮後のファイル
String archivedFile = "archive.zip";
//Zipファイルを作成
try {
//ファイル出力ストリーム
FileOutputStream fos = new FileOutputStream(archivedFile);
//Zipファイル出力ストリーム
ZipOutputStream zos = new ZipOutputStream(fos);
//ファイルの数だけループ
for(int i = 0; i < originFiles.length; i++) {
//圧縮対象ファイルの追加
File targetZip = new File(originFiles[i]);
//ファイル入力ストリーム
FileInputStream fis = new FileInputStream(targetZip);
//Zipファイルに書き込む
ZipEntry ze = new ZipEntry(targetZip.getName());
zos.putNextEntry(ze);
//バッファを利用してデータを読み込んでZIPに書き込む
byte[] buffer = new byte[256];
int length;
//一定のバイトずつ書き込んでいく。バイトの最後まで書き込み終えたら終了とする
while((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0 , length);
}
fis.close();
}
//各ストリームを閉じる
zos.closeEntry();
zos.close();
fos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
今回はoriginFilesという変数に複数のファイル名を定義し、それぞれループを回すことで複数のファイルをZipファイルに圧縮を行っていますが、もちろん1つのファイルだけを圧縮することも可能です。
今回使用したファイルはプロジェクトと同じフォルダに配置して試していますが、もちろん別のフォルダのファイルを圧縮することも可能です。
また、このコードでは圧縮するファイルをべた書きしていますが、ここを変数に置き換えるとより実用的なコードに近づきます。
Zip圧縮処理も入出力ストリームを利用して実装すること、そして、ストリームは入出力が終わったら閉じることを忘れないようにすること、この辺りはきちんと押さえておいた方がいいでしょう。
実際の動作
では、実際の動作を確認してみましょう。
まず、前準備として以下のようにZipファイル圧縮対象のファイルをプロジェクトのフォルダに配置します。
次に、mainメソッドから、先ほど作成したファイルをZip圧縮するメソッドを呼び出します。
public static void main(String[] args) {
archiveZipMul();
}
最後に、プログラムを実行してみます。
すると、以下のように正常にZipファイルが生成されていることが確認できました。
Zipファイルの中身を見てみると、きちんと圧縮されていることが確認できます。
まとめ
今回は以下のことをお話ししました。
- JavaでZipファイルの圧縮を行うにはパッケージのインポートが必要であること
- Zipファイルの圧縮は入出力ストリームを利用して実装できること
Zipファイルの圧縮、解凍は、実際にシステムを作る際に必要になることも頻繁ではないにしろそこそこあるかと思います。
そのため、方法を覚えておくと効率よくコーディングが出来ますので、きちんと覚えて活かしてほしいと思います。
なお、実際の開発現場ではパスワード付Zip圧縮ファイルを生成する必要がある場合もあるかと思いますが、Javaの標準機能だけだとパスワード付き圧縮が出来ない問題があります。
ただ、実装方法はきちんとありますので、別途記事を作成してそこでお話ししたいと思います。
今回の記事はここまでとなります。
また次の記事でお会いしましょう。