package com.example.android.recipe022;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
public class Recipe022 extends Activity {
private static final String zipFileName = "recipe_022_sample.zip";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// res/rawに置いたファイルからFileオブジェクトを作りたいので
// 一旦ローカルファイルに書き出す
res2file();
// ここから本番
String filepath = "/data/data/" + getPackageName() + "/files/" + zipFileName;
unzip(this, filepath);
}
// 指定されたZIPファイルをSDカードに解凍します。
// SDカードの有無のチェックや容量のチェックは省略しています。
public void unzip(Context context, String filepath) {
// SDカード/パッケージ名なディレクトリを表すFileを生成
File outDir = new File(Environment.getExternalStorageDirectory(),
context.getPackageName());
// パッケージ名のディレクトリがなければ作成します。
if (outDir.exists() == false) {
outDir.mkdir();
}
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
// ZipFileのインスタンスを生成
ZipFile zipFile = new ZipFile(filepath);
// ZIPファイルのエントリのリストを取得
Enumeration<? extends ZipEntry> entries = zipFile.entries();
// エントリの最後までループ
while (entries.hasMoreElements()) {
// 次のエントリを取得
ZipEntry entry = entries.nextElement();
// 出力ファイルのインスタンスを生成
File outFile = new File(outDir, entry.getName());
// ディレクトリの場合は、ディレクトリを作成
if (entry.isDirectory()) {
outFile.mkdir();
// ファイルの場合は、ファイルを作成
} else {
// 入力
InputStream in;
in = zipFile.getInputStream(entry);
bin = new BufferedInputStream(in);
// 出力
bout = new BufferedOutputStream(
new FileOutputStream(outFile));
// 入力から出力へ
int bytedata = 0;
while((bytedata = bin.read()) != -1) {
bout.write(bytedata);
}
bout.flush();
}
}
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bin != null) bin.close();
if (bout != null) bout.close();
} catch (IOException e) {
}
}
}
private void res2file() {
InputStream in;
in = getResources().openRawResource(R.raw.recipe_022_sample);
OutputStream out;
byte[] buffer = new byte[1024];
try {
out = openFileOutput(zipFileName, MODE_PRIVATE);
while(true) {
int size = in.read(buffer);
if (size <= 0) break;
out.write(buffer, 0, size);
}
out.close();
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}