【Java】ZipOutputStreamクラスを使ってzipファイルを圧縮する!
Zipファイルを圧縮するにはZipOutputStreamクラスを使用します。
ZipOutputStreamクラスは、Zipファイル形式でファイルを書き込むための出力ストリーム・フィルタを実装するクラスとなります。
そのため、BufferedInputStreamクラスをセットで使用すると、実行速度が早くなるのでZipOutputStreamクラスでZipファイルを圧縮する場合はBufferedInputStreamクラスを組み合わせて使用しましょう。
今回はZipOutputStreamクラスを使って、Zipファイルの圧縮を行います。
目次
ZipOutputStreamクラスとは
ZipOutputStreamクラスとは、Zipファイル形式でファイルを書き込むための出力ストリーム・フィルタを実装するクラスで、圧縮データと圧縮解除データの両方をサポートします。
ZipOutputStreamクラスの書き方
FileReaderクラスの構文は下記となります。
1 2 |
import java.io. BufferedInputStream; import java.util.zip.ZipOutputStream; |
ZipOutputStreamクラスをインポートすることで、ZipOutputStreamクラスで準備されているメソッドが使用できるようになります。
また、BufferedInputStreamクラスを使用すると、実行速度が上がるので、ZipOutputStreamクラスを使用する場合はBufferedReaderクラスもインポートしておきましょう。
Zipファイルを圧縮するサンプルコード
zipファイルを圧縮するサンプルコードを紹介します。
コンソールから実行する場合は、カレントディレクトリに「target」ディレクトリを用意し、「target」ディレクトリ内に任意のファイルとディレクトリを用意します。
Eclipseで実行する場合は、プロジェクト直下に「target」ディレクトリを用意し、「target」ディレクトリ内に任意のファイルとディレクトリを用意します。
その状態でMain.javaを実行します、
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
// ファイルを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 { // 作成するzipファイル File zipFile = new File("CompressedFile.zip"); // 作成前のzipファイルの存在確認結果を表示する System.out.println( "zip圧縮前の存在確認:" + zipFile.exists()); // 作成するzipファイル用の出力ストリーム ZipOutputStream zostr = new ZipOutputStream( new FileOutputStream(zipFile)); // 圧縮対象 File targetFile = new File("target"); // ファイルの圧縮を行う Main.compressFile(zostr, targetFile); // 作成するzipファイル用の出力ストリームを閉じる zostr.close(); // 作成後のzipファイルの存在確認結果を表す。 System.out.println( "zip圧縮後の存在確認: " + zipFile.exists()); } // 実際にファイルをにファイルをzip圧縮するメソッド private static void compressFile( ZipOutputStream zos, File file) throws Exception { byte[] buf = new byte[1024]; int len; if (file.isDirectory()) { // 対象がディレクトリの場合 // 作成するzipファイルにディレクトリのエントリの設定を行う zostr.putNextEntry(new ZipEntry(file.getPath() + "/")); // ディレクトリ内のファイル一覧を取得する File[] childFileList = file.listFiles(); for (File childFile: childFileList) { //ディレクトリ内のファイルにて再帰呼び出しする compressFile(zostr, childFile); } }else { // 対象がファイルの場合 // 作成するzipファイルにエントリの設定を行う zostr.putNextEntry(new ZipEntry(file.getPath())); // 圧縮するファイル用の入力ストリーム BufferedInputStream bistr = new BufferedInputStream( new FileInputStream(file)); // 圧縮するファイルを読み込みながら、 //zipファイル用の出力ストリームへ書き込みをする while ((len = bistr.read(buf, 0, buf.length)) != -1) { zostr.write(buf, 0, len); } // 圧縮するファイル用の入力ストリームを閉じる bistr.close(); // エントリを閉じる zostr.closeEntry(); } } } |
出力結果
zip圧縮前の存在確認:false
zip圧縮後の存在確認:true
compress.zipというファイルが作され、コンソールには
zip圧縮前の存在確認:false
zip圧縮後の存在確認:true
と表示されます。
また、 圧縮するファイルの入力ストリームにBufferedInputStreamクラスを使用することで実行速度を速くしています。
今回のポイント
ZipOutputStreamでZipファイルを圧縮
ファイルをZip圧縮するにはZipOutputStreamクラスを使用する。
⚫︎ ZipOutputStreamクラスを使用することで、ファイルをZip圧縮することができる
⚫︎ 次の手順を行うことで、ファイルをZip圧縮することができる
1.書き込み先の出力ストリームをラップする形でZIP出力ストリームを作成
2.ZipOutputStreamクラスのputNextEntryメソッドで、Zipファイル内でのエントリ名を設定
3.圧縮対象がディレクトリの場合、ディレクトリ名の最後に「/」を追加した値をエントリ名に設定
4.圧縮するファイルの内容を読み込み、ZipOutputStreamクラスのwriteメソッドで、ZIP出力ストリームに書き込む
5.すべての内容を書き込み終えたら、読み込み元のストリームを閉じ、ZipOutputStreamクラスのcloseEntryメソッドでエントリを閉じる
2〜4の処理を、Zip圧縮するファイルの数だけ繰り返す
6.ZipOutputStreamクラスのcloseメソッドで、ZIP出力ストリームを閉じる
⚫︎ 圧縮するファイルの入力ストリームにBufferedInputStreamクラスを使用することで実行速度を速くすることができる
関連記事
FileOutputStreamクラスを使ってファイルにデータを書き込む方法についてはこちらをご参考ください。
FileInputStreamクラスを使ってファイルにデータを読み込む方法についてはこちらをご参考ください。
ZipInputStreamクラスを使ってzipファイルを解凍する方法についてはこちらをご参考ください。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。