3

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ワークスペースエンコーディングを使用しています。ファイルにはキリル文字の単語「Криминалистика」が含まれています。これはUTF-8の非BOMファイルです。

私は両方のプロジェクトにJavaSE-1.6(jdk1.6.0_29)を使用しています。私は、Windows 7 OS、windows-1252システムエンコーディングを使用しています。

アップデート

ようやくバグを再現することができました。テストできるようにプロジェクトを更新しました:https ://github.com/snowindy/getResourceAsStream-Bug

このバグは、mavenpom.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 に答える