В чем разница между Reader и InputStream? А когда что использовать? Если я могу использовать Reader для чтения символов, почему я буду использовать поток ввода, я думаю, для чтения объектов?
В чем разница между 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 используется часто.