Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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