【Java】ZipInputStreamクラスを使ってZipファイルを解凍する!

Zipファイルを解凍するにはZipInputStreamクラスを使用します。

ZipInputStreamクラスは、Zipファイル形式でファイルを書き込むための入力ストリーム・フィルタを実装するクラスとなります。

そのため、BufferedOutputStreamクラスをセットで使用すると、実行速度が速くなるので、ZipInputStreamクラスでZipファイルを解凍する場合はBufferedOutputStreamクラスと組み合わせて使用しましょう。

今回はZipInputStreamクラスを使って、Zipファイルの解凍を行います。

ZipInputStreamクラスとは

ZipInputStreamクラスとは、Zipファイル形式でファイルを書き込むための入力ストリーム・フィルタを実装するクラスで、圧縮データと圧縮解除データの両方をサポートします。

ZipInputStreamクラスの書き方

FileReaderクラスの構文は下記となります。

ZipInputStreamクラスをインポートすることで、ZipInputStreamクラスで準備されているメソッドが使用できるようになります。

また、BufferedOutputStreamクラスを使用すると、実行速度が上がるので、ZipInputStreamクラスを使用する場合はBufferedOutputStreamクラスもインポートしておきましょう。

Zipファイルを解凍するサンプルコード

Zipファイルを解凍するサンプルコードを紹介します。

コンソールから実行する場合はカレントディレクトリに上記のzipファイルを用意します。
Eclipseで実行する場合は、プロジェクトの直下に上記のzipファイルを用意します。

その状態でMain.javaを実行します、

Main.java

出力結果

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ファイルを圧縮する方法についてはこちらをご参考ください。

Writer

ST

株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。

最新の案件情報