繁体   English   中英

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

[英]Java class.getResourceAsStream() returns incorrect byte

我刚用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系统编码。

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>
...

好的,我已经得到了答案。

此配置解决了以下问题:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM