FileInputStream vs FileReader
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
, а писатель только для чтения и записи только текста?
Ответы
Ответ 1
Да, ваш вывод - это правильные подклассы Reader
и Writer
для чтения/записи текстового содержимого. InputStream
/OutputStream
предназначены для двоичного содержимого. Если вы посмотрите на документацию:
Reader
- Абстрактный класс для чтения потоков символов
InputStream
- Абстрактный класс является суперклассом всех классов, представляющих входной поток байтов.
Ответ 2
FileReader
(и, действительно, все, что распространяется на Reader) действительно для текста. Из документации Reader
:
Абстрактный класс для чтения потоков символов.
(Emphasis mine.) Посмотрите API, и вы увидите, что все это связано с текстом - char
вместо byte
повсюду.
InputStream
и OutputStream
предназначены для двоичных данных, таких как файлы mp4.
Лично я бы избегал FileReader
вообще, хотя, поскольку он всегда использует кодировку по умолчанию для системы по умолчанию. Вместо этого используйте InputStreamReader
вокруг a FileInputStream
... но только тогда, когда вы хотите иметь дело с текстом.
В стороне, что очень неэффективный способ копирования из ввода на вывод... используйте перегрузки read
и write
, которые считывают или записывают из буфера - либо byte[]
, либо char[]
. В противном случае вы вызываете чтение и запись для каждого байта/символа в файле.
Вы должны также закрыть потоки ввода-вывода в блоках finally
, чтобы они были закрыты, даже если при обработке их выдается исключение.
Ответ 3
FileInputStream
используется для чтения потоков необработанных байтов данных, таких как сырые изображения. FileReaders
, с другой стороны, используются для чтения потоков символов
Разница между FileInputStream
и FileReader
заключается в том,
FileInputStream
читает байтовый файл байтом, а FileReader
считывает символ файла по символу.
Поэтому, когда вы пытаетесь прочитать файл, содержащий символ "Č"
,
в FileInputStream
даст результат как 196 140
, так как значение ASCII
Č
равно 268
.
В FileReader
будет представлен результат как 268
, который является значением ASCII
для char Č
.
Ответ 4
"FileWriter предназначен для записи потоков символов. Для записи потоков необработанных байтов следует использовать FileOutputStream.
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileWriter.html
FileWriter и FileReader предназначены для потоков символов...
С наилучшими пожеланиями.
Furkan
Ответ 5
Текстовый файл можно читать с использованием как fileReader
, так и fileInputStream
, но mp3 и png можно читать только с помощью fileInputStream