В чем разница между Reader и InputStream? А когда использовать что? Если я могу использовать Reader для чтения символов, почему я буду использовать входной поток, я думаю, чтобы читать объекты?
В чем разница между Reader и InputStream?
Ответ 1
InputStream - это необработанный метод получения информации от ресурса. Он захватывает байты данных байтом без какого-либо перевода. Если вы читаете данные изображения или любой двоичный файл, это поток для использования.
A Reader предназначен для потоков символов. Если информация, которую вы читаете, является всем текстом, то Reader позаботится о расшифровке символов для вас и даст вам символы Unicode из исходного входного потока. Если вы читаете какой-либо текст, это поток для использования.
Вы можете обернуть InputStream и превратить его в Reader с помощью класса InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Ответ 2
InputStreams используются для чтения байтов из потока. Поэтому они полезны для двоичных данных, таких как изображения, видео и сериализованные объекты.
Считыватели, с другой стороны, представляют собой потоки символов, поэтому их лучше всего использовать для чтения символьных данных.
Ответ 3
Я предполагаю, что источником путаницы является то, что InputStream.read()
возвращает int
, а Reader.read()
также возвращает int
.
Разница в том, что InputStream.read()
возвращает байтовые значения в диапазоне от 0 до 255, соответствующие необработанному содержимому потока байтов, а Reader.read()
возвращает символьное значение в диапазоне от 0 до 65357 (поскольку существует 65358 различных кодовых точек юникода)
InputStream
позволяет читать содержимое побайтно, например, содержимое "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
.
Ответ 4
Один принимает байты, а другой принимает символы.