AndroidでZIPファイルを作成する


java.util.zipパッケージを使えばAndroidアプリケーションからZIPファイルを作成することができます。
たとえばアプリケーションで扱うデータをZIPファイルに圧縮して外部ストレージに保存するというような用途で利用すると良いでしょう。

詳細は続きからどうぞ。

クラスとメソッド

ZIPファイルの作成には下記のクラスとメソッドを使います。

  • java.util.zip.ZipOutputStream : ZIPファイル形式でファイルを書き込むための出力ストリーム
  • java.util.zip.ZipEntry : ZIPファイルエントリを表すためのクラス

エントリの設定

ZIPファイルはそのZIPファイルに含まれるファイルやディレクトリの情報をエントリと呼ばれる形で保持しています。
エントリは上記のjava.util.zip.ZipEntryクラスで作成することができます。

1
ZipEntry(String name)

パラメータ

  • name : ZipEntryの名前

作成したエントリをZIPファイルに登録するにはZipOutputStreamクラスに定義されている
putNextEntryメソッドを使います。

1
putNextEntry (ZipEntry ze)

パラメータ

  • ze : エントリのオブジェクト

エントリはZIPファイルに含めるファイルの数だけ登録しなければなりません。
エントリを連続で登録するときは前のエントリがクローズされている必要があるので注意が必要です。

1
closeEntry ()

サンプルコード

下記はSDカードなどの外部ストレージのSampleフォルダ以下に保存されているSample1.jpgとSample2.jpgを
output.zipに圧縮するサンプルコードです。実行するとSampleフォルダ以下にoutput.zipが作成されます。

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
// 外部ストレージのパス
File externalStoragePath = Environment.getExternalStorageDirectory();
 
// 入力ストリーム
InputStream is = null;
 
// ZIP形式の出力ストリーム
ZipOutputStream zos = null;
 
// 入力対象のJPEGファイル
String inputFiles[] = new String[2];
inputFiles[0] = externalStoragePath+"/Sample/Sample1.jpg";
inputFiles[1] = externalStoragePath+"/Sample/Sample2.jpg";
 
// 出力対象のZIPファイル
String zipfile = externalStoragePath+"/Sample/output.zip";
 
// 入出力用のバッファを作成
byte[] buf = new byte[1024];
 
// ZipOutputStreamオブジェクトの作成
try {
    zos = new ZipOutputStream(new FileOutputStream(zipfile));
} catch (FileNotFoundException e2) {
    e2.printStackTrace();
}
 
try {
    for (int i=0; i<inputFiles.length; i++) {
        // 入力ストリームのオブジェクトを作成
    is = new FileInputStream(inputFiles[i]);
 
    // ZIPエントリを作成。名前は入力ファイルのファイル名
    ZipEntry ze = new ZipEntry(inputFiles[i]);
 
    // 作成したZIPエントリを登録
    zos.putNextEntry(ze);
 
    // 入力ストリームからZIP形式の出力ストリームへ書き出す
    int len=0;
    while ((len = is.read(buf)) != -1) {
        zos.write(buf, 0, len);
    }
 
    // 入力ストリームを閉じる
    is.close();
 
    // エントリをクローズする
    zos.closeEntry();
}
 
// 出力ストリームを閉じる
zos.close();
One Comment