【Java】ZipInputStreamクラスを使ってZipファイルを解凍する!
Zipファイルを解凍するにはZipInputStreamクラスを使用します。
ZipInputStreamクラスは、Zipファイル形式でファイルを書き込むための入力ストリーム・フィルタを実装するクラスとなります。
そのため、BufferedOutputStreamクラスをセットで使用すると、実行速度が速くなるので、ZipInputStreamクラスでZipファイルを解凍する場合はBufferedOutputStreamクラスと組み合わせて使用しましょう。
今回はZipInputStreamクラスを使って、Zipファイルの解凍を行います。
目次
ZipInputStreamクラスとは
ZipInputStreamクラスとは、Zipファイル形式でファイルを書き込むための入力ストリーム・フィルタを実装するクラスで、圧縮データと圧縮解除データの両方をサポートします。
ZipInputStreamクラスの書き方
FileReaderクラスの構文は下記となります。
1 2 |
import java.io.BufferedOutputStream; import java.util.zip.ZipInputStream; |
ZipInputStreamクラスをインポートすることで、ZipInputStreamクラスで準備されているメソッドが使用できるようになります。
また、BufferedOutputStreamクラスを使用すると、実行速度が上がるので、ZipInputStreamクラスを使用する場合はBufferedOutputStreamクラスもインポートしておきましょう。
Zipファイルを解凍するサンプルコード
Zipファイルを解凍するサンプルコードを紹介します。
コンソールから実行する場合はカレントディレクトリに上記のzipファイルを用意します。
Eclipseで実行する場合は、プロジェクトの直下に上記のzipファイルを用意します。
その状態で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 |
// 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; // 解凍するファイルの存在確認結果を表示する // ここでは「target」ディレクトリを含むzipファイルを // 解凍した場合 File file = new File("target"); System.out.println( "解凍前のtargetディレクトリの存在確認:" + file.exists()); // 解凍するzipファイル File zipFile = new File("compressedFile.zip"); // 解凍するzipファイル用の入力ストリーム ZipInputStream zistr = new ZipInputStream( new FileInputStream(zipFile)); // zipファイルのエントリの準備 ZipEntry zipEntry = null; // エントリ単位に処理を行う while ((zipEntry = zistr.getNextEntry()) != null) { // エントリを表示 System.out.println(zipEntry); // 解凍先のファイル File uncompressFile = new File(zipEntry.getName()); if (zipEntry.isDirectory()) { // ディレクトリの場合ディレクトリを作成 uncompressFile.mkdirs(); } else { // 解凍先ファイル用の出力ストリーム BufferedOutputStream bostr = new BufferedOutputStream( new FileOutputStream(uncompressFile)); // zipファイルを読み込みながら、 // 解凍先ファイル用の出力ストリームへ書き込みをする while ((len = zistr.read(buf)) != -1) { bostr.write(buf, 0, len); } // 解凍先ファイル用の出力ストリームを閉じる bostr.close(); } } // 解凍するzipファイル用の入力ストリームを閉じる zistr.close(); // 解凍したファイルの存在確認結果を表示する System.out.println( "解凍後のtargetディレクトリの存在確認:" + file.exists()); } } |
出力結果
target/
target directory1/
target\directory1\File1.txt
target directory1\File2.txt
target\directory1\directory2/
target\File3.txt
target\test4.txt
解凍後のtargetディレクトリの存在確認:true
解凍先ファイル用の出力ストリームにBufferedOutputStreamクラスのインスタンスを作成し、実行速度を速くしています。
また、解凍するzipファイル(compressedFile.zip)の内容は下記となります。
target
|ーーdirectory1
| |ーーFile1.txt
| |ーーFile2.txt
| |ーーdirectory2
|ーーFile3.txt
|ーーFile4.txt
日本語のファイル名を使う場合の注意点
通常の圧縮解凍ソフトではプラットフォームの環境に合わせた文字コードを使用して格納するファイル名を変換しますが、Javaではzipファイル名を UTF-8に変換しているため、通常の圧縮解凍ソフトを使用した場合、Javaで作成しzipファイルを正しく取り扱うことができない場合があります。
なお、Java7では、ZipInputStreamクラスやZipOutputStreamクラスのインスタンスを作成する際に「Charset」インスタンスで文字コードを指定することが可能になり、UTF-8以外の文字コードを指定することが可能になりました。
今回のポイント
ZipInputStreamでZipファイルを解凍
Zipファイルを解凍するにはZipInputStreamクラスを使用する。
⚫︎ ZipInputStreamクラスを使用することでzipファイルを解凍することができる。
⚫︎ 次の手順でzipファイルを解凍する
1. 読み込み先の入力ストリームをラップする形でZIP入力ストリームを作成する。
2. ZipInputStreamクラスのgetNextEntryメソッドでエントリを取得する。
すべてのエントリを取得した場合、「null」が戻される。
3. 解凍するファイルがディレクトリの場合、ディレクトリを作成する。
4. ZipInputStreamクラスのreadメソッドで、zipファイルから解凍するファイルを読み込みながら、解凍先の出力ストリームに書き込みを行う。
5. 最後にZipInputStreamクラスのcloseメソッドで、ZIP入力ストリームを閉じる。
⚫︎ BufferedOutputStreamクラスを使用することで実行速度が上がる
⚫︎ Java7からは日本語のファイル名もzipファイルとして正しく取り扱うことができる
関連記事
FileOutputStreamクラスを使ってファイルにデータを書き込む方法についてはこちらをご参考ください。
FileInputStreamクラスを使ってファイルにデータを読み込む方法についてはこちらをご参考ください。
ZipOutputStreamクラスを使ってZipファイルを圧縮する方法についてはこちらをご参考ください。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。