我正在尝试使用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)
我完全理解文件的大小超出了内存限制,但该问题是否有解决办法?提前谢谢。
答案 0 :(得分:6)
我怀疑问题不是文件的大小,而是缓存Zip表条目时失败的条目数。
您自己的选择是;
答案 1 :(得分:4)
Java类ZipFile
和ZipEntry
不能包含超过613 MB内存的任何内容。
最好按照自己的建议实施某种批处理。例如,您可以将每个ZIP条目的解压缩大小相加,并在每次总大小超过100 MB时上传文件。
答案 2 :(得分:4)
您是否需要能够通过名称从zip文件中提取特定条目,或者您是否可以从上到下阅读整个文件一次?如果后者你可以尝试使用ZipInputStream
而不是ZipFile
,因为它不需要预先解析中心目录 - 你可以阅读一个条目,用它做一些事情,丢弃它,阅读下一个条目,......
答案 3 :(得分:0)
您可以尝试以字节数组的形式读取文件,并对其进行部分处理。仍然取决于你想对你的文件做什么。
答案 4 :(得分:0)
请参阅以下链接下载并解压缩zip文件,它将解决您的问题。
下载Zip文件: -
对于提取Zip文件: -
并且zip文件只使用winrar软件制作,否则会给你错误。