Иерархия классов Reader / Writer ориентирована на символы, а иерархия классов Input Stream / Output Stream ориентирована на байты.В основном существует два типа потоков. Потоки байтов, которые используются для обработки потока байтов, и потоки символов для обработки потоков символов.
В вашем случае я вижу, что вы используете поток, ориентированный на байты.
Потоки символов часто являются «обертками» для потоков байтов.Поток символов использует поток байтов для выполнения физического ввода-вывода, тогда как поток символов обрабатывает перевод между символами и байтами.Например, FileReader использует FileInputStream, а FileWriter использует FileOutputStream.
Итак, если вы хотите работать с символами (чтение текстовых файлов), перейдите к символьно-ориентированному потоку (Reader / Writer).Но если вы хотите обрабатывать содержимое независимо от типа файла, перейдите к байтовому потоку.