OutOfMemoryError读取一个巨大的ZipFile

时间:2012-10-22 11:30:33

标签: java android zip out-of-memory zipfile

我正在尝试使用java.util.zip API在Android中打开一个大的(大约1 GiB)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)

我完全理解文件的大小超出了内存限制,但该问题是否有解决办法?提前谢谢。

5 个答案:

答案 0 :(得分:6)

我怀疑问题不是文件的大小,而是缓存Zip表条目时失败的条目数。

您自己的选择是;

  • 分解Zip,因此它没有太多文件。
  • 获得更多记忆
  • 编写自己的库以阅读ZIP。

答案 1 :(得分:4)

Java类ZipFileZipEntry不能包含超过613 MB内存的任何内容。

最好按照自己的建议实施某种批处理。例如,您可以将每个ZIP条目的解压缩大小相加,并在每次总大小超过100 MB时上传文件。

看看:http://truezip.java.net/

答案 2 :(得分:4)

您是否需要能够通过名称从zip文件中提取特定条目,或者您是否可以从上到下阅读整个文件一次?如果后者你可以尝试使用ZipInputStream而不是ZipFile,因为它不需要预先解析中心目录 - 你可以阅读一个条目,用它做一些事情,丢弃它,阅读下一个条目,......

答案 3 :(得分:0)

您可以尝试以字节数组的形式读取文件,并对其进行部分处理。仍然取决于你想对你的文件做什么。

答案 4 :(得分:0)

请参阅以下链接下载并解压缩zip文件,它将解决您的问题。

下载Zip文件: -

Download Zip File

对于提取Zip文件: -

Extract Zip File

并且zip文件只使用winrar软件制作,否则会给你错误。