"invalid CEN header (bad signature)" 使用 Java 8 jar 命令从 zip 存档中提取 4GB+ 文件时
"invalid CEN header (bad signature)" when extracting a 4GB+ file from a zip archive using Java 8 jar command
我有一个包含 5 个文件的 zip 文件。其中四个文件很小(几 kB),但一个文件大于 4GB。我知道 JDK-4681995,从 Java 7 开始,它向 Java 添加了大文件支持(64 位 zip 支持)。我正在使用 64 位 Java 8在 Windows 8.1:
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 以上的文件?
这个异常是由Java8中的bugJDK-8223811引起的,由-f
标志触发。提交者 re-created 问题使用:
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
我有一个包含 5 个文件的 zip 文件。其中四个文件很小(几 kB),但一个文件大于 4GB。我知道 JDK-4681995,从 Java 7 开始,它向 Java 添加了大文件支持(64 位 zip 支持)。我正在使用 64 位 Java 8在 Windows 8.1:
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 以上的文件?
这个异常是由Java8中的bugJDK-8223811引起的,由-f
标志触发。提交者 re-created 问题使用:
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