【问题标题】:java.util.zip.ZipError: invalid CEN header (bad signature)java.util.zip.ZipError:无效的 CEN 标头(错误的签名)
【发布时间】:2014-04-27 11:50:31
【问题描述】:

我在 Red Hat Linux 上使用 Java 1.7.0_40,我有以下代码:

Path zipfile = Paths.get(filename);
FileSystem fs = FileSystems.newFileSystem(zipfile, FileTest.class.getClassLoader());

filename 变量指向一个 788MB 的 zip 文件。 zip 文件的未压缩大小为 8.3GB。当我运行上面的代码时,我得到以下异常:

Exception in thread "main" java.util.zip.ZipError: invalid CEN header (bad signature)
        at com.sun.nio.zipfs.ZipFileSystem.zerror(ZipFileSystem.java:1605)
        at com.sun.nio.zipfs.ZipFileSystem.initCEN(ZipFileSystem.java:1058)
        at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:130)
        at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:139)
        at java.nio.file.FileSystems.newFileSystem(FileSystems.java:386)
        at FileTest.readFromZip(FileTest.java:35)
        at FileTest.main(FileTest.java:25)

我的印象是 Java 7 能够处理大型 zip 文件。谁能解释为什么会这样?

谢谢。

【问题讨论】:

标签: java zip nio


【解决方案1】:

我在基于 Maven 的项目中也遇到过这个问题。问题是由于 jar 损坏而发生的。从 .m2 文件夹中删除 jars 并再次构建项目;它就像魅力一样。

【讨论】:

    【解决方案2】:

    出现此问题是由于下载的 jar 文件已损坏。

    如果您使用的是 Maven。

    • 为解决此问题,请删除 C:/Users/public/.m2/repository 文件夹中的特定 Jar 文件。
    • 然后在 POM.xml 中添加新版本的 Maven。
    • 重建并尝试。它会正常工作的。

    【讨论】:

      【解决方案3】:

      有两种可能的解释:

      【讨论】:

        【解决方案4】:

        在我的情况下,我通过在创建 zip 文件的步骤中将 Zip64Mode.Always 更改为 Zip64Mode.AsNeeded 解决了这个问题,所以看起来像这样:

        ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(os);
                zaos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);
                zaos.setUseLanguageEncodingFlag(true);
                zaos.setUseZip64(Zip64Mode.AsNeeded);
                zaos.setFallbackToUTF8(true);
                zaos.setEncoding("UTF-8");
        

        那么这行代码就开始工作了:

        try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
        .
        .
        .
        }
        

        顺便说一下,使用 Java 8。

        【讨论】:

          【解决方案5】:

          问题 JDK-4681995 解决了对 zip 存档的大文件 (4GB+) 支持(即 64 位 zip 支持)(“添加对大 (> 4GB) zip/jar 文件的支持”) .

          但是,此更改直到 1.7.0 build 55 才包含在 Java 7 中,这是您使用的特定版本(1.7.0 build 40)之后的几个版本。更新到 build 55 或更高版本将解决问题。

          【讨论】:

            【解决方案6】:

            这是你的pom文件中maven编译器的配置问题。 java源和目标的默认版本是1.5,即使使用JDK也有更高的版本。

            要修复,添加更高java版本的maven编译器插件配置部分,例如:

            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.6.1</version>
              <configuration>
                <source>1.6</source>
                <target>1.6</target>
              </configuration>
            </plugin>
            

            有关更多信息,请查看以下链接:

            maven compiler

            bug report

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-07-24
              • 1970-01-01
              • 1970-01-01
              • 2014-07-12
              • 2018-11-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多