FileReader
(и действительно что-нибудь расширяющий Reader) действительно для text . Из документации Reader
:
Абстрактный класс для чтения символьных потоков .
(Подчеркните мое.) Посмотрите на API, и вы увидите, что все это связано с текстом - char
вместо byte
повсюду.
InputStream
и OutputStream
предназначены для двоичных данных, таких как файлы mp4.
Лично я бы вообще избежал FileReader
, поскольку он всегда использует системную кодировку символов по умолчанию. Вместо этого используйте InputStreamReader
вокруг FileInputStream
... но только когда вы хотите разобраться с текстом.
Кроме того, это очень неэффективный способ копирования с входа на выход ... используйте перегрузки read
и write
, которые читают или записывают из буфера - либо byte[]
, либо char[]
. В противном случае вы вызываете read и write для каждого байта / символа в файле.
Вы должны также закрыть потоки ввода-вывода в finally
блоках, чтобы они закрывались, даже если во время обработки выдается исключение.