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

时间:2010-09-27 13:56:04

标签: java zip

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

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文件的问题(处理它们的代码非常成熟)我已经验证我可以使用'unzip'从命令行正确解压缩zip文件。

任何线索?谢谢!

2 个答案:

答案 0 :(得分:6)

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

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

参考:

  1. Support for ZIP64 in Java 7 has been added

答案 1 :(得分:3)

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

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

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