java - 使用 Java 8 jar 命令从 zip 存档中提取 4GB+ 文件时出现 "invalid CEN header (bad signature)"

标签 java java-8 jar zip large-files

我有一个包含 5 个文件的 zip 文件。其中四个文件很小(几 kB),但一个文件大于 4GB。我知道 JDK-4681995 ,它从 Java 7 开始向 Java 添加大文件支持(64 位 zip 支持)。我在 Windows 8.1 上使用 64 位 Java 8:

C:\Users\user\Desktop>java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

压缩文件大小如下:

07/07/2019  10:18 AM       503,966,751 snapshot-20190707.zip

压缩文件的内容是:

07/07/2019  09:53 AM                67 database.sha1
07/07/2019  09:51 AM     4,508,840,068 database.sql
07/07/2019  09:53 AM                74 database_schema.sha1
07/07/2019  09:51 AM            36,386 database_schema.sql
07/07/2019  09:51 AM            45,280 backup.log

如果我尝试提取 4GB 的文件,我会遇到一个异常,它看起来Java 7 exception for 64-bit zip files 完全一样:

C:\Users\user\Desktop>jar xvf snapshot-20190707.zip database.sql
java.util.zip.ZipException: invalid CEN header (bad signature)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:225)
        at java.util.zip.ZipFile.<init>(ZipFile.java:155)
        at java.util.zip.ZipFile.<init>(ZipFile.java:126)
        at sun.tools.jar.Main.extract(Main.java:1004)
        at sun.tools.jar.Main.run(Main.java:305)
        at sun.tools.jar.Main.main(Main.java:1288)

有什么方法可以使用 Java 8+ jar 命令从 64 位 zip 存档中提取 4GB 以上的文件?

最佳答案

此异常是由错误 JDK-8223811 引起的在 Java 8 中,它由 -f 标志触发。提交者使用以下方法重现了问题:

jar xvf archive.zip *

来自对错误报告的评论(2019 年 5 月 19 日):

This is only reproducible on JDK 8 versions. It is fixed in JDK 9 and above and is not an issue in the latest JDK 11, 12 or 13.

Java 8 的解决方法是避免在使用 -f 标志时指定单个文件,并简单地提取存档中的所有文件:

此版本的命令成功提取所有文件,没有任何问题:

C:\Users\user\Desktop>jar xvf snapshot-20190707.zip
 inflated: backup.log
 inflated: database_schema.sha1
 inflated: database_schema.sql
extracted: database.sha1
 inflated: database.sql

关于java - 使用 Java 8 jar 命令从 zip 存档中提取 4GB+ 文件时出现 "invalid CEN header (bad signature)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56936845/

相关文章:

Java 最佳实践 - 在类变量之前声明构造函数是一件坏事吗?

java - 如何从java流中只返回一个字符串

java - 如何选择以编程方式运行哪个 JDK

java - 使用 com.google.code.gson 在 Java8 中创建 JSON 对象

java - 使用 ikvmc 创建 .dll 时包含外部 jar

java - 如何获取从不在类路径中的 jar 加载的任何类作为流?

java - 如何使用 JPA 以编程方式创建长度有限的 MySQL 索引?

java - 在 CentOS6.4 上使用 Jenkins。无法在端口 443 上启动监听器。任何提示原因

java - (N)Hibernate "session-per-application"被认为是特定用例的邪恶?

java - 使用 VM 参数导出 jar