Zip解凍処理 (Android)

Zip解凍処理 をメモ

解凍クラス
package jp.co.xxx.zip;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import android.util.Log;


/**
 * ZipAnalyzer
 * @author BraveCanary
 */
public class ZipAnalyzer {

    /**
     * ロックオブジェクト
     */
    private final static Object mLock = new byte[0];

	/**
	 * パラメータエラー
	 */
	public static final int ERROR_PARAM   = 0;

	/**
	 * 解析エラー
	 */
	public static final int ERROR_ANALYZE = 1;

	/**
	 * ファイルなしエラー
	 */
	public static final int ERROR_NO_FILE = 2;

	/**
	 * 入出力エラー
	 */
	public static final int ERROR_IO      = 3;

	/**
	 * その他エラー
	 */
	public static final int ERROR_OTHER   = 4;

	/**
	 * AnalyzerListener
	 */
	private AnalyzerListener mAnalyzerListener;


	/**
	 * ZipAnalyzer
	 * @param listener
	 */
	public ZipAnalyzer(AnalyzerListener listener) {
		this.mAnalyzerListener = listener;
	}

	/**
	 * AnalyzerListener
	 */
    public interface AnalyzerListener {

    	/**
    	 * 処理終了
    	 */
    	public void onFinish();

    	/**
    	 * データ返却
    	 * @param entryName 項目名
    	 * @param buffer    データ
    	 */
    	public void onEntry(String entryName, byte[] buffer);

    	/**
    	 * エラー
    	 * @param errCode エラーコード
    	 */
    	public void onError(int errCode);
    }

    /**
     * 解凍実行
     * @param dirName  ディレクトリ名
     * @param fileName ファイル名
     */
	public void execute(File dirName, String fileName){
        synchronized (mLock) {

			// パラメータチェック
			if (mAnalyzerListener == null) {
				return;
			}
			if (dirName == null || fileName == null) {
				mAnalyzerListener.onError(ERROR_PARAM);
				return;
			}

			// ZIPファイル情報取得
			File zipFile = new File(dirName, fileName);
			if (!zipFile.exists()) {
				mAnalyzerListener.onError(ERROR_NO_FILE);
				return;
			}

			// ZIP展開
			ZipInputStream zis = null;
			boolean analyzeErr = false;
			try {
				zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile)));
				ZipEntry   ze       = null;
				byte[]     buffer   = new byte[4096];
				int        readSize = 0;

				// データ取得
				while ((ze = zis.getNextEntry()) != null) {
					ByteArrayOutputStream bos = new ByteArrayOutputStream();
					while (true) {
						readSize = zis.read(buffer);
						if (readSize <= 0) {
							break;
						}
						bos.write(buffer, 0, readSize);
					}

					mAnalyzerListener.onEntry(ze.getName(), bos.toByteArray());
					bos.close();
					bos = null;
				}
				zis.closeEntry();

			}
			catch (IOException e) {
				Log.e("Exception", Log.getStackTraceString(e));
				mAnalyzerListener.onError(ERROR_IO);
				analyzeErr = true;
			}
			finally {
				if (zis != null) {
					try {
						zis.close();
					} catch (Exception e) {
						Log.e("Exception", Log.getStackTraceString(e));
					}
					zis = null;
				}
			}

			// 処理終了
			if (!analyzeErr) {
				mAnalyzerListener.onFinish();
			}
        }
	}

}
<呼び元処理>

1. Zipファイルの保存先ディレクトリ名、ファイル名を指定

    ZipAnalyzer za = new ZipAnalyzer(zipListener);
    za.execute(ディレクトリ名, ファイル名);
2. Zipファイル解凍後、AnalyzerListenerに結果を返却
	private AnalyzerListener zipListener = new AnalyzerListener() {
		@Override
		public void onFinish() {
		}

		@Override
		public void onError(int errCode) {
		}

		@Override
		public void onEntry(String entryName, byte[] buffer) {
		}
	};