Zipファイルの解凍

2011/08/14

ZipFile と ZipEntry ~Androidでzipを解凍する を参考に ZIP ファイルを解凍してみる。

サンプルコード

ボタンをクリックして、SDカード/パッケージ名/sample.zip ファイルを SDカード/パッケージ名/sample/ に解凍。 ※sample.zip は sample ディレクトリを含むZIP [java] 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);
    }
}

[/java] 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 バイトずつ処理

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