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