我刚用getResourceAsStream()遇到了一个非常奇怪的问题。
在我的prod项目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 9A D1 80 D0 B8 D0 BC D0 B8 D0 BD D0 B0 D0 BB D0 B8 D1 81 D1 82 D0 B8 D0 BA D0 B0
D0 9A D1 80 D0 B8 D0 BC D0 B8 D0 BD D0 B0 D0 BB D0 B8 D1 3F D1 82 D0 B8 D0 BA D0 B0
在此之后,我决定创建一个小错误显示项目,并以Github为例进行托管。这是链接:https://github.com/snowindy/getResourceAsStream-Bug
我基本上复制了所需的代码,运行后,我看不到再现的问题:
D0 9A D1 80 D0 B8 D0 BC D0 B8 D0 BD D0 B0 D0 BB D0 B8 D1 81 D1 82 D0 B8 D0 BA D0 B0
D0 9A D1 80 D0 B8 D0 BC D0 B8 D0 BD D0 B0 D0 BB D0 B8 D1 81 D1 82 D0 B8 D0 BA D0 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系统编码。
更新
我终于能够重现这个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>
...
答案 0 :(得分:1)
好的,我已经得到了答案。
此配置解决了问题:
<project>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
我得到了这个答案的启发:https://stackoverflow.com/a/8979120/792313