我刚才碰到一个很奇怪的问题的getResourceAsStream()。
在我的督促项目JUnit测试我读使用的getResourceAsStream(),我发现的getResourceAsStream()有时会替代一些字节的测试数据:
byte[] fileBytes = FileUtils.readFileToByteArray(new File(
"resources/test/parser/test-short-enc.xml"));
printBytes(fileBytes);
byte[] classPathBytes = IOUtils.toByteArray(ParserTest.class
.getResourceAsStream("/test/parser/test-short-enc.xml"))
printBytes(classPathBytes);
在这个项目输出如下:
D0 D1 9A 80 D0 D0 B8 D0 BC B8 D0 D0 BD B0 D0 D0 BB B8 D1 81 82 D1 D0 D0 B8 D0 BA B0
D0 D1 9A 80 D0 D0 B8 D0 BC B8 D0 D0 BD B0 D0 D0 BB B8 D1 3F D1 D0 82 D0 B8 D0 BA B0
在此之后,我决定创建一个小bug,显示项目,并在Github上托管它作为一个例子。 这里的链接: https://github.com/snowindy/getResourceAsStream-Bug
我基本上是复制所需的代码,运行后,我看不出问题重现:
D0 D1 9A 80 D0 D0 B8 D0 BC B8 D0 D0 BD B0 D0 D0 BB B8 D1 81 82 D1 D0 D0 B8 D0 BA B0
D0 D1 9A 80 D0 D0 B8 D0 BC B8 D0 D0 BD B0 D0 D0 BB B8 D1 81 82 D1 D0 D0 B8 D0 BA B0
该printBytes功能如下:
public static void printBytes(byte[] bv) {
System.out.println();
for (byte b : bv) {
System.out.print(' ');
System.out.print(String.format("%02X", b));
}
}
这里是什么地方?
我使用Eclipse,UTF-8编码的工作空间,该文件包含cyrilic单词 “Криминалистика”,这是一个UTF-8无BOM文件。
我用的JavaSE-1.6(jdk1.6.0_29)这两个项目,我有Windows 7操作系统,与Windows 1252系统编码。
UPDATE
我终于能重现bug。 我更新的项目,所以你可以测试一下: https://github.com/snowindy/getResourceAsStream-Bug
该错误只出现如果你有看到maven pom.xml这个代码。 这意味着它的Maven的具体
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...