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