FileInputStream против FileReader - PullRequest
40 голосов
/ 01 марта 2011
FileReader rd=new FileReader("new.mp4");
FileWriter wr=new FileWriter("output.mp4");
int ch;
while((ch=rd.read())!=-1)
  wr.write(ch);

wr.flush();
wr.close();

Когда я использую FileReader и FileWriter для чтения и записи файла mp4, файл output.mp4 не может быть хорошо отрисован.Но когда я вместо этого использую FileInputStream и FileOutputStream, это сработало хорошо.

Так могу ли я сделать вывод, что FileReader и FileWriter предназначены только для чтения и записи текста?

Ответы [ 5 ]

47 голосов
/ 01 марта 2011

Да, ваш вывод верный, подклассы Reader и Writer предназначены для чтения / записи текстового содержимого.InputStream / OutputStream для двоичного содержимого.Если вы посмотрите на документацию:

Reader - Абстрактный класс для чтения потоков символов

InputStream - Абстрактный класс - это суперкласс всех классов, представляющих входной потокбайтов.

29 голосов
/ 01 марта 2011

FileReader (и действительно что-нибудь расширяющий Reader) действительно для text . Из документации Reader:

Абстрактный класс для чтения символьных потоков .

(Подчеркните мое.) Посмотрите на API, и вы увидите, что все это связано с текстом - char вместо byte повсюду.

InputStream и OutputStream предназначены для двоичных данных, таких как файлы mp4.

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

Кроме того, это очень неэффективный способ копирования с входа на выход ... используйте перегрузки read и write, которые читают или записывают из буфера - либо byte[], либо char[]. В противном случае вы вызываете read и write для каждого байта / символа в файле.

Вы должны также закрыть потоки ввода-вывода в finally блоках, чтобы они закрывались, даже если во время обработки выдается исключение.

5 голосов
/ 29 апреля 2014

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

Разница между FileInputStream и FileReader в том, что FileInputStream читает файл побайтно, а FileReader читает файлсимвол за символом.

Поэтому, когда вы пытаетесь прочитать файл, содержащий символ "Č", в FileInputStream результат будет выглядеть как 196 140, потому что значение ASCII Čis 268.

In FileReader выдаст результат как 268, что является значением ASCII char Č.

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

"FileWriter предназначен для записи потоков символов. Для записи потоков необработанных байтов рассмотрите возможность использования FileOutputStream."

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileWriter.html

FileWriter и FileReader предназначены для потоков символов ...

С наилучшими пожеланиями.

Furkan

0 голосов
/ 10 июля 2016

Текстовый файл может быть прочитан с использованием fileReader и fileInputStream, но mp3 и png могут быть прочитаны только с использованием fileInputStream

  1. fileReader читает символ на символ

  2. fileInputStream читает побайтно

...