В чем разница между Reader и InputStream? - PullRequest
76 голосов
/ 06 декабря 2010

В чем разница между Reader и InputStream? А когда использовать что? Если я могу использовать Reader для чтения символов, почему я буду использовать inputtream, думаю, для чтения объектов?

Ответы [ 4 ]

117 голосов
/ 06 декабря 2010

InputStream - это необработанный метод получения информации из ресурса. Он захватывает данные побайтово, без какого-либо перевода. Если вы читаете данные изображения или любой двоичный файл, это поток для использования.

Reader предназначен для символьных потоков. Если информация, которую вы читаете, полностью текстовая, то Reader позаботится о декодировании символов для вас и предоставит вам символы Юникода из исходного потока ввода. Если вы читаете любой тип текста, это поток для использования.

Вы можете обернуть InputStream и превратить его в Reader с помощью класса InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
17 голосов
/ 06 декабря 2010

InputStreams используются для чтения байтов из потока.Поэтому они полезны для двоичных данных, таких как изображения, видео и сериализованные объекты.

С другой стороны, считыватели являются символьными потоками, поэтому их лучше всего использовать для чтения символьных данных.

6 голосов
/ 04 декабря 2017

Я предполагаю, что источником путаницы является то, что InputStream.read() возвращает int, а Reader.read() также возвращает int.

Разница в том, что InputStream.read() возвращает байтовые значения в диапазоне от 0 до 255, соответствующие необработанному содержимому потока байтов, а Reader.read() возвращает символьное значение в диапазоне от 0 до 65357

AnInputStream позволяет читать содержимое байта за байтом, например, содержимое «a ‡ a» читается как поток из 5 байтов, а именно: 97, 226, 128, 161 и 97 где a -> U+0061 -> 0x61 -> 97 и ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161.

A Reader позволяет читать содержимое символа за символом, поэтому содержимое «a ‡ a» читается как 3 символа 97, 8225 и 97, где a -> U+0061 -> 0x61 -> 97 и ‡ -> U+2021 -> 0x2021 -> 8225.

1 голос
/ 06 декабря 2010

Один принимает байты, а другой принимает символы.

...