「AndroidでZIPファイルの圧縮・展開をする」ではAndroidアプリでZIPファイルを圧縮、および展開する方法について解説しました。
今回はAndroidアプリでGZIPファイルを扱う方法について解説します。
GZIPは多くのUNIXで標準搭載されている圧縮形式です。
ファイルアーカイバの機能を持たないため、複数のファイルやディレクトリを1つにまとめることはできません。
しかしながら、UNIX上では標準入出力を介してデータの圧縮・展開を行えることため、様々な用途で利用されています。
また、HTTP1.1以降でサポートされているデータ圧縮機能のフォーマットとしてgzipを
利用することが可能であるため、HTTP通信を行うAndroidアプリでgzipを利用することで
通信料を減らすことが可能になります。
(HTTP通信でgzipを利用する方法については別途解説します)
AndroidでGZIP形式のファイルを扱うために必要なのは下記2つのクラスです。
- GZIPInputStreamクラス
- GZIPOutputStreamクラス
GZIP形式でもZIPファイルを扱う場合と同様に、GZIP形式のファイルを書き出す場合にはGZIPOutputStreamクラスを、GZIP形式のファイルを読み込む場合にはGZIPInputStreamクラスを使います。
続きからサンプルコードを紹介します。
GZIP形式でファイルを圧縮する
まずはGZIP形式でファイルを圧縮する手順を紹介しましょう。
上記で述べたように、GZIP形式は複数のファイルをまとめて圧縮することはできません。
単一のデータストリームに対して圧縮処理を行います。
下記はSDカードなどのストレージに保存されているJPEGファイルをGZIP圧縮するサンプルコードです。
■GzipArchiverActivity.java
public void compress(String inputFile, String outputFile) {
// 入力ストリーム
InputStream is = null;
// GZIP形式の出力ストリーム
GZIPOutputStream gzos = null;
// 出力バッファ
byte[] buf = new byte[1024];
try {
// 入力ストリームを作成する
is = new FileInputStream(inputFile);
// GZIP形式の出力ストリームを作成する
gzos = new GZIPOutputStream(new FileOutputStream(outputFile));
// 入力ストリームから出力ストリームへ書き出す
int len = 0;
while ((len = is.read(buf)) != -1) {
gzos.write(buf, 0, len);
}
// 入力ストリームを閉じる
is.close();
// 出力ストリームを閉じる
gzos.close();
tv.setText("compress successful!");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
tv.setText("FileNotFoundException");
} catch (IOException e1) {
e1.printStackTrace();
tv.setText("IOException");
}
}
まず、1行目のメソッド定義ですが、引数には入力元となるファイルのパスと出力先となるGZIPファイルのパスを指定します。
13行目でファイルからの入力ストリームを作成し、16行目でGZIP形式の出力ストリームを作成します。
そして、20〜22行目で入力ストリームから読み出したデータをそのままGZIP形式の出力ストリームへ書き出しています。
GZIP形式でファイルを展開する
次にGZIP形式で圧縮されたファイルを展開してみましょう。
■GzipArchiverActivity.java
public void extract(String inputFile) {
// GZIP形式の入力ストリーム
GZIPInputStream gzis = null;
// 出力ストリーム
BufferedOutputStream os = null;
// 入力バッファ
byte[] buf = new byte[1024];
try {
// GZIP形式の入力ストリームを作成する
gzis = new GZIPInputStream(new FileInputStream(inputFile));
// 出力ストリームを作成する
os = new BufferedOutputStream(new FileOutputStream(EXTRACT_FILENAME));
// 入力ストリームから出力ストリームへ書き出す
int len = 0;
while ((len = gzis.read(buf)) != -1) {
os.write(buf, 0, len);
}
// 入力ストリームを閉じる
gzis.close();
// 出力ストリームを閉じる
os.close();
tv.setText("extract successful!");
} catch (FileNotFoundException e) {
e.printStackTrace();
tv.setText("FileNotFoundException");
} catch (IOException e) {
e.printStackTrace();
tv.setText("IOException");
}
}
1行目、extractメソッドの引数はGZIPで圧縮されたファイルのパスです。
13行目でGZIP形式の入力ストリームを作成するときに、引数で与えられたGZIPファイルのパスを指定します。
そして、16行目で出力ストリームを作成し、20行目〜22行目にかけてGZIP圧縮されたデータを書き出しています。
以上、お疲れさまでした。