Почему символьные потоки? - PullRequest
0 голосов
/ 18 марта 2011

Я понимаю, что потоки символов Java оборачивают потоки байтов так, что базовый поток байтов интерпретируется в соответствии с системным значением по умолчанию или другим определенным набором символов.

В моих системах набор символов по умолчанию - UTF-8.

Если я использую FileReader для чтения в текстовом файле, все выглядит нормально, поскольку набор символов по умолчанию используется для интерпретации байтов из базового InputStreamReader.Если я явно определю InputStreamReader для чтения текстового файла в кодировке UTF-8 как UTF-16, все, очевидно, выглядит странно.Используя поток байтов, такой как FileInputStream, и перенаправляя его вывод в System.out, все выглядит хорошо.

Итак, мои вопросы таковы;

  • Почему полезно использовать поток символов?

  • Почему я бы использовал поток символов вместо непосредственного использования потока байтов?

  • Когда полезно определить конкретный набор символов?

Ответы [ 3 ]

6 голосов
/ 18 марта 2011

Код, который имеет дело со строками, должен «мыслить» только в терминах текста - например, читая входной источник построчно, вам не нужно заботиться о природе этого источника.

Однакохранилище обычно ориентировано на байты - поэтому вам нужно создать преобразование между байтово-ориентированным представлением источника (инкапсулированным InputStream) и символьно-ориентированным представлением источника (инкапсулированным Reader).

Таким образом, метод, который (скажем) считает строки текста во входном источнике, должен принимать параметр Reader.Если вы хотите посчитать строки текста в двух файлах, один из которых закодирован в UTF-8, а другой - в UTF-16, вы должны создать InputStreamReader вокруг FileInputStream для каждого файла,указание соответствующей кодировки каждый раз.

(Лично я бы полностью избегал FileReader - тот факт, что он не позволяет указать кодировку, делает его бесполезным IMO.)

3 голосов
/ 18 марта 2011

InputStream читает байты, а Reader читает символы.Из-за того, как байты отображаются в символы, вам нужно указать набор символов (или кодировку) при создании InputStreamReader, по умолчанию это набор символов платформы.

1 голос
/ 18 марта 2011

Когда вы читаете / пишете текст, содержащий символы, которые могут быть> 127, используйте поток символов. Когда вы читаете / записываете двоичные данные, используйте поток байтов.

Вы можете читать текст в двоичном виде, если хотите, но если вы не сделаете много предположений, это редко приносит вам большую пользу.

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