3

我刚刚遇到了一个非常奇怪的 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 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

之后,我决定创建一个小型的 bug 展示项目,并将其托管在 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 工作空间编码,文件包含西里尔字母“Криминалистика”,它是一个 UTF-8 无 BOM 文件。

我对这两个项目都使用 JavaSE-1.6 (jdk1.6.0_29),我有 Windows 7 操作系统,windows-1252 系统编码。

更新

我终于能够重现该错误。我更新了项目,以便您可以对其进行测试:https ://github.com/snowindy/getResourceAsStream-Bug

仅当您在 maven pom.xml 中有此代码时,才会出现该错误。这意味着它是特定于 Maven 的

<build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
        <resource>
            <directory>resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
...
4

1 回答 1

1

好的,我有答案了。

此配置解决了问题:

<project>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
...

我得到了这个答案的启发:https ://stackoverflow.com/a/8979120/792313

于 2013-02-03T10:49:43.087 回答