Java的class.getResourceAsStream()返回不正确的字节(Java clas

2019-07-19 04:57发布

我刚才碰到一个很奇怪的问题的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>
...

Answer 1:

好吧,我得到了答案。

这种配置解决了这个问题:

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

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



文章来源: Java class.getResourceAsStream() returns incorrect byte