В чем разница между Reader и InputStream?

87

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

саб
источник
3
Что касается «Я предполагаю читать объекты?», Существуют специальные потоки ввода / вывода для чтения / записи объектов Java. Это ObjectInputStream и ObjectOutputStream соответственно, и они являются частью более крупной структуры сериализации. java.sun.com/developer/technicalArticles/Programming/… Но это только одно использование потоков ввода / вывода, другие могут отправлять данные через сокет и т. д.
Марк Петерс

Ответы:

138

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

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

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

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Берин Лорич
источник
безупречный ответ Берин! Благодарность!
Gaurav
18

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

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

Винсент Рамдхани
источник
Когда использовать read()побайтно, а когда использовать read(byte[])массив байтов. На мой взгляд, чтение массива всегда лучше. тогда вы можете привести мне пример, где использовать read()байтовый read(byte[])массив ИЛИ байтовый массив. ИЛИ BufferedInputStream.?
Асиф Муштак
11

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

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

InputStreamПозволяет считывать содержимое байт за байтом, например содержимое «A ‡ A», считываются в виде потока 5 байтов (каждый из которых представлено в виде intот 0 до 255) , в результате чего 97, 226, 128, 161и , 97где

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

A Readerпозволяет читать содержимое посимвольно, поэтому содержимое «a ‡ a» читается как 3 символа 97, 8225а 97где

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

Символ ‡ обозначается как U + 2021 в Юникоде.

РубенЛагуна
источник
Это должен быть принятый ответ. Спасибо за пример
дашборд
2

Предыстория InputStream и Reader:

На заре Java единственным способом выполнить ввод с консоли было использование байтового потока (InputStream и OutputStream).

Сценарии использования:

Сегодня использование байтового потока для чтения консольного потока также допустимо. Однако для коммерческих приложений предпочтительным методом чтения ввода с консоли является использование символьно-ориентированного потока (Reader). Reader упрощает интернационализацию и поддержку.

Примечание. Это всего лишь дополнительная информация для изучения кодов ввода-вывода Java: шаблон проектирования реализации ввода-вывода Java следует шаблону проектирования декоратора. Если вы знакомы с шаблоном проектирования «декоратор», то сможете легко понять его реализацию.

Атиф
источник
1

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

Аарон МакИвер
источник
0

InputStream accept byte , Читатель принимает символ, В Java один символ = два байта, и Читатель использует буфер, InputStream не использует. Все файлы хранятся на диске или передаются на основе байтов, включая изображения и видео, но символ находится в памяти, поэтому InputStream используется часто.

LiLi
источник