2

APIを使用してAndroidで大きな(約1 GiB)zipファイルを開こうとするjava.util.zipと、次のエラーが発生します。

java.lang.OutOfMemoryError
at java.util.HashMap.makeTable(HashMap.java:555)
at java.util.HashMap.doubleCapacity(HashMap.java:575)
at java.util.HashMap.put(HashMap.java:405)
at java.util.zip.ZipFile.readCentralDir(ZipFile.java:366)
at java.util.zip.ZipFile.<init>(ZipFile.java:132)
at java.util.zip.ZipFile.<init>(ZipFile.java:103)
at com.foo.bar.zip.archive.ZipArchive.<init>(ZipArchive.java:44)

ファイルのサイズがメモリ制限を大幅に超えていることは完全に理解していますが、この問題の回避策はありますか?前もって感謝します。

4

5 に答える 5

6

問題はファイルのサイズではなく、Zipテーブルのエントリをキャッシュするときに失敗するエントリの数にあると思われます。

あなた自身のオプションは次のとおりです。

  • Zipを分割して、ファイルがそれほど多くないようにします。
  • より多くのメモリを取得します
  • ZIPを読み取るための独自のライブラリを作成します。
于 2012-10-22T11:34:26.550 に答える
4

JavaクラスZipFileでありZipEntry、613MBを超えるメモリを含めることはできません。

自分で提案するときに、ある種のバッチ処理を実装するのがおそらく最善です。たとえば、各ZIPエントリの解凍されたサイズを合計し、合計サイズが100MBを超えるたびにファイルをアップロードできます。

見てください:http://truezip.java.net/

于 2012-10-22T11:35:40.480 に答える
4

zipファイルから名前で特定のエントリを抽出できる必要がありますか、それともファイル全体を上から下に1回だけ読み取ることができますか?後者の場合は、中央ディレクトリを事前に解析する必要がないため、ZipInputStreamではなく使用してみるZipFileことができます。1つのエントリを読み取り、それを使用して何かを実行し、破棄して、次のエントリを読み取ることができます...

于 2012-10-22T11:37:14.463 に答える
0

ファイルをバイト配列で読み取って、部分的に処理することができます。それでも、それはあなたがあなたのファイルで何をしたいかに依存します。

于 2012-10-22T11:33:21.480 に答える
0

zipファイルのダウンロードと抽出については、以下のリンクを参照してください。問題が解決します。

Zipファイルをダウンロードする場合:-

Zipファイルをダウンロード

Zipファイルの抽出の場合:-

Zipファイルを抽出する

そして、zipファイルはwinrarソフトウェアのみを使用して作成されます。そうでない場合、エラーが発生します。

于 2012-10-22T11:39:30.963 に答える