AndroidでZIPファイルを展開する


「AndroidでZIPファイルを作成する」ではAndroidアプリケーションからZIPファイルを作成する方法についてご紹介しました。
今回はAndroidアプリケーションでZIPファイルを展開する方法についてご紹介します。

詳しい説明は続きからどうぞ。

クラスとメソッド

ZIPファイルの展開には下記のクラスとメソッドを利用します。

  • java.util.zip.ZipInputStream : ZIPファイル形式のファイルを展開するための入力ストリーム
  • java.util.zip.ZipEntry : ZIPファイルエントリを表すためのクラス

ZipInputStream

ZipInputStreamはZIP形式で圧縮されているファイルを展開する為の入力ストリームです。
コンストラクタの引数には展開したいファイルの入力ストリームを指定します。

ZipInputStream(InputStream stream)

たとえば、SDカード上に保存されているSample.zipをZipInputStreamに指定するには以下のようにします。

// Sample.zipをZipInputStreamに指定
ZipInputStream in = new ZipInputStream(new BufferedInputStream(new FileInputStream("/sdcard/Sample.zip")));

エントリの取得

「AndroidでZIPファイルを作成する」でも説明しているようにZIPファイルは圧縮されているファイルをエントリという形式で保持しています。エントリを取得するにはZipInputStreamクラスに定義されているgetNextEntryメソッドを使います。

public ZipEntry getNextEntry()

戻り値
ZIPファイルに含まれるエントリを返す。エントリの終端に達したらnullを返す。

getNextEntryメソッドを繰り返し呼ぶことでZIPファイルに含まれるすべてのエントリに順にアクセスすることができます。エントリを取得したらreadメソッドでそのエントリのデータを読み取り、出力ファイルとして保存します。

while( (zipEntry = in.getNextEntry()) != null)
{
   // 出力用ファイルストリームの生成
   out = new BufferedOutputStream(new FileOutputStream("/sdcard/" + zipEntry.getName()));

   // エントリの内容を出力
    while((data = in.read()) != -1)
    {
          out.write(data);
    }
}

上記コードでは、SDカード上にZIPファイルから展開したファイルを保存しています。
ファイル名にはzipEntryクラスのgetNameメソッドを使うことで取得したエントリの名前を指定しています。