[Tips] Android で Zipファイルの中身をバッファストリーミング的に扱う方法

前回のエントリに引き続き、Androidの開発関連メモ。

今、コミックビュワーアプリを作っていて、zipファイル内に保存されている画像を、ファイルに解凍せず、バッファ上で処理するやり方をいろいろ調べたんだけど見つからず。
apacheのorg.apache.tools.zip.ZipFileを使っているのだが公式のドキュメントも見つけきれず、結局、ファイルに書き出す方法で解凍をしているサイトを色々と参考にしつつ、試行錯誤して一応動く形にまでたどり着いたのがこれ。



public void zipDeCompress(String fromFile) throws IOException{
byte[] buf = new byte[1024];
Enumeration enume = null;
// Sample.zipをZipInputStreamに指定
try {
zipFile = new ZipFile(openFileName,"MS932");
enume = zipFile.getEntries();
while( enume.hasMoreElements() )
{
ZipEntry zipEntry = (ZipEntry)enume.nextElement();
if(zipEntry.isDirectory())
continue;
if( zipEntry.getName().toLowerCase().endsWith(".jpg") ||
zipEntry.getName().toLowerCase().endsWith(".png") ){ //ファイル名の一覧を作る処理
BufferedInputStream zipF = new BufferedInputStream(zipFile.getInputStream(zipEntry));
ImageView imv = new ImageView(getApplicationContext());
imv.setImageBitmap(BitmapFactory.decodeStream(zipF));
int i=0;
for( ; i < zipedFileList.size() ; i++ ){
if( zipEntry.getName().compareTo(zipedFileList.get(i)) < 0 ){
zipedFileList.add(i,zipEntry.getName());
images.add(i,imv);
break;
}
}
if( i==zipedFileList.size() ){
zipedFileList.add(zipEntry.getName());
images.add(imv);
}
zipF.close();
zipF=null;
imv=null;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
//Toast.makeText(getApplicationContext(), R.string.err_msg_file_failed, Toast.LENGTH_SHORT).show();
//ComicImageActivity.class.onDestroy();
return;
} catch (IOException e) {
e.printStackTrace();
//Toast.makeText(getApplicationContext(), R.string.err_msg_file_failed, Toast.LENGTH_SHORT).show();
//onDestroy();
return;
}
}




ポイントは、zipFile.getInputStream(zipEntry))の部分。
ずっとzipEnryからメソッドを呼び出すことでストリーミングが取り出せるんだと思っていたけど、zipFileとzipEntryを組み合わせて使わなければいけなかったらしい。
たぶん、知っている人にとっては普通なんだろうけど、Javaプログラミングはまだまだ初心者な私にとってははまったポイントでした。

ちなみに、上のサンプルのやり方だと、zipファイルの中身の画像が10枚くらい増えた段階でOutofmemoryに。
いくらなんでもメモリ使いすぎだろと思うけど、原因はたぶんBitmapとかではなくImageViewに画像を全部保存しようとしているから。
この辺はもう一回ちゃんと動く状態に整理して、またここでまとめます。

やっぱGitHubか何かにアカウント作った方がいいかなぁ~。

この記事へのコメント

この記事へのトラックバック

テーマ別記事