7

zip ファイルを解凍するには、これを参照してパッケージ java.util.zip* のクラスを使用しましたが、正しく動作しますが、40MB のファイルを解凍するには 59 秒かかります。iPhoneプロジェクトで同じzipファイルを試したとき(私たちは両方のプラットフォーム用のアプリを開発しています-AndroidとiPone&zipファイルを解凍し、解凍したコンテンツをSDCARD-Androidまたはドキュメントディレクトリ-iPhoneに保存する機能を備えています)、14秒しかかかりません。iPhone アプリはziparchiveを使用します。

だから私の質問は:

1.上記の実験から、JavaでのSDCARDへの解凍&ファイル書き込み操作は、iPhoneアプリに比べて時間がかかることが判明したので、NDKを使用したC/C++レベルの解凍&ファイル書き込み操作を使用することにしました。これは正しい選択ですか?

2.Google、stackoverflow、および minizip を使用するよう提案されたものを検索しましが、Android で minizip を使用する方法について十分なヘルプがありません。Android用のミニジップを試した人はいますか?

3.LibzはNDKに追加されていますが、使用方法がわからないため、目標を達成するためにlibzのNDK開発も試みました。NDK で libz を試した人はいますか?

4.大きなzipファイルを解凍してSDCARDに短時間で書き込むJavaまたはC/C++の他のフレームワークはありますか?

私を助けてください。

ここに私のJava解凍コードがあります:

public String unzip() {

    String result;

    try {

        FileInputStream fin = new FileInputStream(this.filePath);
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null;

        while ((ze = zin.getNextEntry()) != null) {

            Log.v("Unzip", "Unzipping " + ze.getName());

            if (ze.isDirectory()) {
                _dirChecker(ze.getName());
            } else {

                // Read 16 k at a time 
                byte[] buffer = new byte[16*1024];
                 int read;

                FileOutputStream fout = new FileOutputStream(this.location+ "/" + ze.getName());

                while ((read = zin.read(buffer)) != -1)
                {
                    fout.write(buffer, 0, read);
                }


                zin.closeEntry();
                fout.close();
            }

        }

        zin.close();
        result = "success";

    } catch (Exception e) {
        Log.e("unzip", "unzip", e);
        result = "failure";
    }

    return result;
}
4

4 に答える 4

5

このコードを試してみませんか。

    String zipname = "data.zip";
FileInputStream fis = new FileInputStream(zipname);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;

while ((entry = zis.getNextEntry()) != null) {
  System.out.println("Unzipping: " + entry.getName());

  int size;
  byte[] buffer = new byte[2048];

  FileOutputStream fos = new FileOutputStream(entry.getName());
  BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);

  while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
    bos.write(buffer, 0, size);
  }
  bos.flush();
  bos.close();
}
zis.close();
fis.close();

}

于 2013-03-14T12:58:14.487 に答える
4

すべての解凍コードは最終的にzlibになります。Androidコアライブラリには「deflate」圧縮のJava実装はありません。

java.util.Zipが「ネイティブ」解凍よりも遅くなる唯一の理由は、ファイルI / Oが適切に行われていない場合、たとえば、何かが非常に小さなバッファーを使用している場合です。質問からリンクされたコードを見ると、これはまさに起こっていることです-それは個々のバイトで動作しています。

ソリューションに関するコメントの1つは、4Kバッファーを使用するパッチを提供しました。それをドロップして、パフォーマンスがどうなるかを確認してください。

于 2013-01-09T01:00:43.723 に答える
1

40Mb のファイルを SD カードに書き込んで時間を測定してみてください。(ほぼ) zip アーカイブ サポート ライブラリのすべての無料 (または有料) の実装は、同じ zlib コードに基づいており、解凍中に最も処理速度がかかります。Java コードはネイティブ コードよりもはるかに遅くなるはずなので、NDK の解凍を試すことをお勧めします。また、圧縮レベル 0 でアーカイブを解凍しようとすると、コードの解凍にかかる時間と、データのコピーだけに費やされる時間が推測できます。

于 2013-01-08T15:42:47.070 に答える