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