2

我正在尝试使用java.util.zipAPI 在 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)

我完全理解文件的大小大大超出了内存限制,但是有什么解决方法吗?提前致谢。

4

5 回答 5

6

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

您自己的选择是;

  • 分解 Zip,使其中没有太多文件。
  • 获得更多内存
  • 编写自己的库来阅读 ZIP。
于 2012-10-22T11:34:26.550 回答
4

Do you need to be able to extract particular entries from the zip file by name, or can you just read through the whole file once from top to bottom? If the latter you could try using ZipInputStream rather than ZipFile, as that doesn't need to parse the central directory up front - you can read one entry, do something with it, discard it, read the next entry, ...

于 2012-10-22T11:37:14.463 回答
4

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

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

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

于 2012-10-22T11:35:40.480 回答
0

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

于 2012-10-22T11:33:21.480 回答
0

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

下载 Zip 文件:-

下载压缩文件

对于提取 Zip 文件:-

提取压缩文件

并且 zip 文件仅使用 winrar 软件制作,否则这会给您带来错误。

于 2012-10-22T11:39:30.963 回答