Являются ли `InputStream` и` Reader` по существу одинаковыми, и являются ли `OutputStream` и` Writer` по существу одинаковыми? - PullRequest
0 голосов
/ 17 мая 2019

В Java InputStream и OutputStream имеют дело с byte[], а Reader и Writer с char[].

  • Имеют ли их вход или выход byte[] и char[] одинаковые значения? (Это мое впечатление, потому что символ и байт в IO имеют одинаковое значение)

  • Другими словами, InputStream и Reader по существу одинаковы и OutputStream и Writer по существу одинаковы?

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Они, по сути, не одинаковы, но делают разные вещи для разных типов данных.

InputStream и OutputStreamработа в байтах .Вы будете использовать их при работе с нетекстовой информацией (например, с изображением).

Reader и Writer работают с символами.Вы будете использовать их при работе с текстовой информацией.

Так что "да" и "нет".:-) InputStream и Reader оба предназначены для чтения информации (поток байтов или поток символов соответственно), а OutputStream и Writer оба предназначены для записи информации (поток байтов или поток)символов соответственно).То, что вы используете, зависит от того, с какими данными вы имеете дело.Потоки ориентированы на байты.Читатели / писатели ориентированы на символы.

Между двумя типами данных существуют классы мостов:

  • InputStreamReader читает из InputStreamи преобразует байты в символы, используя CharSet (один предоставлен явно или по имени).
  • OutputStreamWriter выполняет обратное преобразование: преобразует символы в байты (снова через CharSet)и записывает байты в OutputStream.

... но большинство Reader / Writer подклассов считывают / записывают в источники / места назначения, которые уже символна основе, и поэтому не имеют дело с байтами вообще.Например, StringReader читает символы из строки.Поскольку источник (строка) уже основан на символах, Reader никогда не имеет дело с байтами, только с символами.

1 голос
/ 17 мая 2019

Да, у вас правильная идея. Стандартные классы InputStreamReader и OutputStreamWriter действуют как адаптеры от интерфейсов потока байтов к интерфейсам потока символов, требуя только, чтобы был задан Charset (обычно UTF-8). Этот Charset будет использоваться для преобразования входящих байтов в символьный тип Java UTF-16, поэтому, в частности, не верно, что фактические байты, считанные из InputStream и Reader, всегда одинаковы.

InputStream обычно используется для чтения данных любого типа, тогда как Reader подходит только для чтения текстовых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...