读取ZIP文件会产生“无效的LOC标头”exception

我有一个大的zip文件,4.3G。 它包含大约100k条目。 我正在Linux上使用Java 1.6.0_14,Ubuntu 32位阅读它,并获得以下exception。

java.util.zip.ZipException: invalid LOC header (bad signature) at java.util.zip.ZipFile.read(Native Method) at java.util.zip.ZipFile.access$1200(ZipFile.java:29) at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:447) at java.util.zip.ZipFile$1.fill(ZipFile.java:230) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) at java.io.BufferedInputStream.read(BufferedInputStream.java:317) at java.io.FilterInputStream.read(FilterInputStream.java:90) 

我没有任何其他ZIP文件的问题(处理它们的代码非常成熟)我已经validation我可以使用’unzip’从命令行正确解压缩zip文件。

有什么线索吗? 谢谢!

Zip文件大小超过4GB,要求zip文件阅读器支持PKWARE的ZIP64扩展。

在Java 6之前,这种支持在java.util.zip类中不可用,并且最近才被添加到Java 7中(不用说,在撰写本文时,这不是GA版本)。

参考:

  1. 添加了对Java 7中ZIP64的支持

正如其他人提到的那样,ZIP标准不支持> 4GB的文件。 有一个名为ZIP64的扩展来解决这个问题,但在Java 7之前不会支持它。

有许多库支持ZIP64,但是当我上次检查时,它们都没有支持流,而是依赖于文件。 如果这不打扰你,TrueZip可能会正常工作。

如果您正在处理流,则必须使用临时文件。