icon Zipファイルの解凍 (2011/08/14)
ZipFile と ZipEntry ~Androidでzipを解凍する を参考に ZIP ファイルを解凍してみる。

サンプルコード


ボタンをクリックして、SDカード/パッケージ名/sample.zip ファイルを SDカード/パッケージ名/sample/ に解凍。
※sample.zip は sample ディレクトリを含むZIP
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button zipAcvhiveButton = (Button) findViewById(R.id.zipArchiveButton);
        zipAcvhiveButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v) 
            {
            	String zipfileName = "sample.zip";
            	String baseDir = Environment.getExternalStorageDirectory().getPath() 
            			+ "/" + v.getContext().getPackageName() + "/";
            	String zipPath = baseDir + zipfileName;
            	String sampleDir = baseDir + "sample";
            	new File(sampleDir).mkdir();
            	zipArchiveFiles(zipPath, baseDir);
            }
        });
    }

    public void zipArchiveFiles(String zipPath, String outputDir)
    {
        err = 0;
        try {
            ZipFile zipFile = new ZipFile(zipPath);
            Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
            while(enumeration.hasMoreElements())
            {
                ZipEntry zipEntry = enumeration.nextElement();
                String outputPath = outputDir + zipEntry.getName();
                zipArchiveFile(zipPath, zipEntry.getName(), outputPath);
            }
            zipFile.close();
        }
        catch(Exception ex)
        {
            err = -1;
            Log.d( "Err", "" + ex);
        }
    }

    public int err = 0;
    public void zipArchiveFile(String zipPath, String file, String outFile)
    {
        err = 0;
        try 
        {
            ZipFile zipFile = new ZipFile(zipPath);
            ZipEntry entry = zipFile.getEntry(file);
            InputStream inputStream = zipFile.getInputStream(entry);
            OutputStream outputStream = new FileOutputStream(outFile);
     
            byte[] buffer = new byte[ 1024 * 4 ];

            int r = 0;
            while( -1 != ( r = inputStream.read(buffer)) )
            {
            	outputStream.write( buffer, 0, r );
            }
            outputStream.close();
            inputStream.close();
            zipFile.close();
        }
        catch( Exception ex )
        {
            err = -1;
            Log.d( "Err", "" + ex);
        }
    }
Android の Zip書き出しは、ちょっと手続きが多いみたいです。

Environment.getExternalStorageDirectory().getPath() で SDカードのパスが取得できる。
zipFile.entries() でZip一覧(ZipEntry を継承したEnumeration)を取得し、ループで1ファイルずつ解凍する。
ちなみに、zipEntry.getName() でファイル名を取得するが、Zip にディレクトリを含む場合はディレクトリを含むパスになる。

sample/xxxx.txt


Zip からの書き出しは ZipFile() で各ファイルパスを指定し、zipFile.getInputStream() でInputStream オブジェクトを取得。

InputStream をループで回し、OutputStream で指定したパスにファイルを書き出す。
※サンプルの場合、1024 x 4 バイトずつ処理

うーん、もうちょっと簡単にならないのかな?
もしかしたら、他の方法もあるかも知れませんが。。。

このサイトについて

HTML5 & CSS3化しつつあるので、現在IEには対応してません。
できれば、Google Chromeやら Apple SafariのWebKit系をお勧めします。

DBからプログラムまで一応全て自作なので、バグってたらすいません。
実験でFlash版(Flex版)を先に作りましたが、ちょっと停止してます。

プロフィール

新宿近辺でSE & プログラマーしてます。
Webアプリの開発・設計とか、最近はiPhoneとか奮闘してます。
デザインはさっぱりです。

音楽は、昔からCubase打ち込み人間で、そっちの方が経歴は長いですが、最近はやる暇がないです。。。

今は、Gon's Privates ってバンドのキーボードやってます。
単発的に、なんちゃってジャズ系のライブもやってます。

名古屋生まれなのでドラゴンズ好きです。

Info && SNS

Gmail

 yohei.yoshikawa@gmail.com

Twitter

 http://twitter.com/yoo_yoo_yoo

あんまつぶやきませんが、一応技術系メインで使ってます。情報交換はこちらへ

FaceBook

 http://www.facebook.com/#!/profile.php?id=1439130626

海外の知り合いがいないので閑散としてます。

mixi

 http://mixi.jp/show_profile.pl?id=230072

音楽仲間とかはこっちメインでやってます。興味があればこちらへ