2010-09-27 92 views
2

我有一个大的zip文件,4.3G。它包含约10万条目。 我在Linux,Ubuntu 32位上使用Java 1.6.0_14读取它,并获得以下例外。读取ZIP文件给出'无效的LOC头'异常

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文件的问题(代码来处理它们是非常成熟的),我已经验证了我能正确解压缩使用“解压缩”命令行中的zip文件。

任何线索?谢谢!

回答

5

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

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

参考:

  1. Support for ZIP64 in Java 7 has been added
3

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

有很多支持ZIP64的库,但是当我最后一次选中时,它们都没有支持流,但依赖于文件代替。如果这不会打扰你,TrueZip可能会正常工作。

如果你正在处理流,你将不得不使用临时文件。

+0

+1为TrueZip。花了一点时间才注意到TFile是File的一个子类,但在此之后TFileInputStream变得更有意义。 – 2011-08-23 17:22:50

相关问题