Java class.getResourceAsStream() возвращает неверный байт

Я только что столкнулся с очень странной проблемой с 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

После этого я решил создать небольшой проект по выявлению ошибок и разместить его на 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 no-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>
...

person snowindy    schedule 03.02.2013    source источник
comment
ИЛИ более вероятная причина в том, что... эти два файла не совпадают.   -  person Brian Roach    schedule 03.02.2013
comment
Может быть, очистка проекта может помочь   -  person Cephalopod    schedule 03.02.2013
comment
@BrianRoach 1) файлы одинаковые, я их скопировал, а не набирал вручную. 2) Проблема в том, что чтение ресурса ClassPath возвращает один неверный байт, а тот же самый файл, доступ к которому осуществляется напрямую, возвращает правильную последовательность байтов.   -  person snowindy    schedule 03.02.2013
comment
@Arian Я почистил проект, перезапустил eclipse, результат тот же.   -  person snowindy    schedule 03.02.2013
comment
Вы уверены, что обе ссылки указывают на один и тот же файл test-short-enc.xml в вашей локальной системе?   -  person Jim Garrison    schedule 03.02.2013
comment
@JimGarrison Да, я. Наконец-то я смог воспроизвести ошибку. Пожалуйста, проверьте раздел обновления поста.   -  person snowindy    schedule 03.02.2013
comment
@BrianRoach, пожалуйста, проверьте раздел обновлений, я смог воспроизвести ошибку.   -  person snowindy    schedule 03.02.2013


Ответы (1)


Хорошо, у меня есть ответ.

Эта конфигурация устраняет проблему:

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

Меня вдохновил этот ответ: https://stackoverflow.com/a/8979120/792313

person snowindy    schedule 03.02.2013