代码之家  ›  专栏  ›  技术社区  ›  Joel

读取zip文件时出现“无效的loc头”异常

  •  2
  • Joel  · 技术社区  · 14 年前

    我有一个大的压缩文件,4.3g。它包含大约100k个条目。 我在Linux,Ubuntu 32位上使用Java1.60E14读取它,并得到以下异常。

    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 回复  |  直到 12 年前
        1
  •  6
  •   Bill the Lizard    12 年前

    zip文件大小超过4GB,需要zip文件读取器支持pkware的zip64扩展。

    直到Java 6,这个支持在JavaUTL.ZIP类中是不可用的,并且最近才被添加到Java 7中(不用说,在编写此时,这不是GA释放)。

    参考文献:

    1. Support for ZIP64 in Java 7 has been added
        2
  •  3
  •   Henning    14 年前

    正如其他人提到的,zip标准不支持文件>4GB。有个分机叫 ZIP64 这就解决了这个问题,但它不会在Java 7之前得到支持。

    有许多库支持zip64,但是当我上次检查它们时,它们都不支持流,而是依赖于文件。如果你不介意的话,TrueZip可能工作得很好。

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