我的类路径(Java 8)上有一个有效的zip文件。它是302617字节长。 我想使用标准ApacheCommons IO Utils将其复制到temp文件夹中,以在应用程序中进行扩展和进一步处理。 如果我将其读取为文件,例如:
File out = new File("out.zip");
File in = new File ("src/main/resources/StartUpData/c4.zip");
try (InputStream is = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out) ) {
IOUtils.copy(is, fos);
System.out.println(out.length());
}
这完全按预期工作-打印302617。
但是如果我从类路径输入流中读取:
try (InputStream is2 = this.getClass().getResourceAsStream("/StartUpData/c4.zip");
FileOutputStream fos = new FileOutputStream(out)) {
IOUtils.copy(is2, fos);
System.out.println(out.length());
}
它生成544115字节的文件。它不是有效的zip格式,无法通过任何命令行zip utils或Java进行解压缩或读取为zip文件。 我只在zip文件中观察到这种情况。对于其他二进制文件或图像,两种方法都可以正常工作。
我研究了两种情况下正在读取的字节。这是文件的前12个字节,来自xxd -b c4.zip
:
00000000: 01010000 01001011 00000011 00000100 00010100 00000000 PK....
00000006: 00001000 00001000 00001000 00000000 10111010 10011110 ......
从类路径输入流中读取文件的第11个字节和第12个字节(10111010 10011110,十六进制ba 9e)。
事实上,任何由第一位设置为1的字节都会被
创建的输入流误读。 this.getClass().getResourceAsStream("/StartUpData/c4.zip")
有人知道为什么仅从类路径读取zip文件会发生这种情况吗? 10111010 10011110如何解释为ef bf? 非常感谢您的任何建议。 我正在使用MacOS High Sierra,我的同事在Windows 10上也观察到了此行为。
答案 0 :(得分:0)
这是一个行家过滤问题,有关解决方案,请参见https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html。添加zip作为排除项可以解决此问题,并且zip文件可以位于类路径上的任何位置