почему обычный IOUtils.toByteArray не совпадает? - PullRequest
0 голосов
/ 15 января 2019

Почему результаты не совпадают при использовании commons.io.IOUtils для получения byte[]?

Методы toByteArray: Inputstream и Reader.

String file = "c:/c.pdf";

try (InputStream is = new FileInputStream(file)) {
    byte[] result = IOUtils.toByteArray(is);
    System.err.println(Arrays.toString(result));
} catch (Exception e) {
    e.printStackTrace();
}

try (Reader reader = new FileReader(file)) {
    byte[] result = IOUtils.toByteArray(reader,"gbk");
    System.err.println(Arrays.toString(result));
} catch (Exception e) {
    e.printStackTrace();
}

1 Ответ

0 голосов
/ 15 января 2019

Краткий ответ: два результата различны, потому что 2-е решение неверно. Никогда не используйте Reader для чтения двоичных данных.

InputStream читает байты файла, не пытаясь придать им какое-либо значение; Reader, напротив, пытается преобразовать их в символы, используя определенную кодировку: ваш второй пример читает байты, преобразует их в символы, а затем метод toByteArray() преобразует эти символы обратно в байты, НО это двойное преобразование не только бесполезно (очевидно), это совершенно неправильно, потому что первое преобразование может завершиться неудачей : когда Reader встречает байт (или группу байтов в случае многобайтовых кодировок, таких как GBK), который не имеет ассоциированного символа, он возвращает знак вопроса, и когда вы переводите эти знаки вопроса обратно в байты, вы получаете значение байта, соответствующее знаку вопроса, а не исходное значение, которое не удалось преобразовать.

Так что проблема не в IOUtils, а в том, что вы используете Reader для чтения PDF.

...