我有一个简单的应用程序,可以解压缩大量的Zip文件。它使用Files.walkFileTree()遍历所需的文件夹并将其解压缩到输出文件夹中。
有超过1600个zip文件。在极少数情况下(精确到3种),我得到了
Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED[1]
at jdk.zipfs/jdk.nio.zipfs.ZipCoder.toString(ZipCoder.java:90)
at jdk.zipfs/jdk.nio.zipfs.ZipCoder$UTF8.toString(ZipCoder.java:64)
at jdk.zipfs/jdk.nio.zipfs.ZipFileSystem.getString(ZipFileSystem.java:938)
at jdk.zipfs/jdk.nio.zipfs.ZipPath.toString(ZipPath.java:603)
at utilities.DazUnzipper$2.visitFile(DazUnzipper.java:149)
at utilities.DazUnzipper$2.visitFile(DazUnzipper.java:1)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2724)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2796)
at utilities.DazUnzipper.unZip(BatchUnzipper.java:146)
at utilities.DazUnzipper.run(BatchUnzipper.java:104)
at utilities.DazUnzipper.main(BatchUnzipper.java:171)
在所有这些失败情况下,有问题的zip文件都会使用7Zip正确解压缩。
我正在使用OpenJDK11。我已经看过ZipCoder的来源,我很困惑。 toString()方法将字节数组作为输入,对该字节数组进行一些处理,检查CoderResult.isUnderflow()的返回码,如果为false,则抛出IllegalArgumentException。
要引用该文档,请执行以下操作:
“当没有更多要处理的输入,或者输入不足,需要其他输入时,将报告下溢。此情况由唯一的结果对象UNDERFLOW表示,其isUnderflow方法返回true。”