В чем разница между Reader и InputStream? А когда что использовать? Если я могу использовать Reader для чтения символов, почему я буду использовать поток ввода, я думаю, для чтения объектов?
87
В чем разница между Reader и InputStream? А когда что использовать? Если я могу использовать Reader для чтения символов, почему я буду использовать поток ввода, я думаю, для чтения объектов?
Ответы:
InputStream - это необработанный метод получения информации из ресурса. Он захватывает данные побайтно, не выполняя никакого преобразования. Если вы читаете данные изображения или любой двоичный файл, этот поток следует использовать.
Reader разработан для символьных потоков. Если информация, которую вы читаете, представляет собой весь текст, то Reader позаботится о декодировании символов за вас и предоставит вам символы Unicode из необработанного входного потока. Если вы читаете текст любого типа, этот поток следует использовать.
Вы можете обернуть InputStream и превратить его в Reader с помощью класса InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
источник
InputStreams используются для чтения байтов из потока. Поэтому они полезны для двоичных данных, таких как изображения, видео и сериализованные объекты.
С другой стороны, считыватели представляют собой символьные потоки, поэтому их лучше всего использовать для чтения символьных данных.
источник
read()
побайтно, а когда использоватьread(byte[])
массив байтов. На мой взгляд, чтение массива всегда лучше. тогда вы можете привести мне пример, где использоватьread()
байтовыйread(byte[])
массив ИЛИ байтовый массив. ИЛИBufferedInputStream
.?Я предполагаю, что источник путаницы в том, что
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 в Юникоде.
источник
Предыстория InputStream и Reader:
На заре Java единственным способом выполнить ввод с консоли было использование байтового потока (InputStream и OutputStream).
Сценарии использования:
Сегодня использование байтового потока для чтения консольного потока также допустимо. Однако для коммерческих приложений предпочтительным методом чтения ввода с консоли является использование символьно-ориентированного потока (Reader). Reader упрощает интернационализацию и поддержку.
Примечание. Это всего лишь дополнительная информация для изучения кодов ввода-вывода Java: шаблон проектирования реализации ввода-вывода Java следует шаблону проектирования декоратора. Если вы знакомы с шаблоном проектирования «декоратор», то сможете легко понять его реализацию.
источник
Один принимает байты, а другой - символы.
источник
InputStream accept byte , Читатель принимает символ, В Java один символ = два байта, и Читатель использует буфер, InputStream не использует. Все файлы хранятся на диске или передаются на основе байтов, включая изображения и видео, но символ находится в памяти, поэтому InputStream используется часто.
источник