java.util.zip.ZipError:无效的 CEN 标头(错误签名)

问题描述 投票:0回答:7

我在 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
7个回答
17
投票

我在基于 Maven 的项目中也遇到了这个问题。该问题是由于 jar 损坏而发生的。从 .m2 文件夹中删除 jar 并重新构建项目;它很有魅力。


12
投票

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

如果您使用 Maven。

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

6
投票

有两种可能的解释:


1
投票

就我而言,我通过在创建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。


0
投票

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

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


0
投票

如果您由于 Jenkins 中的编译问题而看到这篇文章。

知道您很可能正在使用更新的 JDK 运行 Jenkins,并且您的项目与旧版本的 Java 兼容,因此您有必要在 VM/容器上并行安装另一个版本的 JDK。

在 Jenkins 中,该选项称为“With Ant”,允许您选择具有特定版本的 Java 来构建项目。


-1
投票

这是你的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编译器

错误报告

© www.soinside.com 2019 - 2024. All rights reserved.