FileInputStream vs FileReader

2022-08-31 20:50:28
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();

当我使用 和 来读取和写入 mp4 文件时,该文件无法很好地呈现。但是当我使用时,它反而工作得很好。FileReaderFileWriteroutput.mp4FileInputStreamFileOutputStream

那么我可以得出结论,只用于阅读和写作文本吗?FileReaderFileWriter


答案 1

是的,您的结论是正确的子类,用于阅读/编写文本内容。 / 用于二进制内容。如果您查看文档:ReaderWriterInputStreamOutputStream

Reader- 用于读取字符流的抽象类

InputStream- 抽象类是表示字节输入流的所有类的超类。


答案 2

FileReader(事实上,任何扩展读者的东西)确实是针对文本的。从读者的文档

用于读取字符流的抽象类。

(强调我的。看看API,你会发现这一切都与文本有关 - 而不是到处都是。charbyte

InputStream并且用于二进制数据,例如 mp4 文件。OutputStream

就我个人而言,我会完全避免,因为它总是使用系统默认字符编码 - 至少在Java 11之前。相反,请在...但只有当你想处理文本时。(或者,使用 。)FileReaderInputStreamReaderFileInputStreamFiles.newBufferedReader

顺便说一句,这是一种非常低效的从输入复制到输出的方式......使用 和 的重载,从缓冲区读取或写入缓冲区 - a 或 .否则,您将对文件中的每个字节/字符调用读取和写入。readwritebyte[]char[]

还应以块的形式关闭 IO 流,以便即使处理它们时引发异常,它们也会关闭。finally


推荐