FileInputStream与FileReader

sar*_*nan 42 java io writer

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();
Run Code Online (Sandbox Code Playgroud)

当我使用FileReaderFileWriter读取和写入mp4文件时,output.mp4文件无法很好地呈现.但是当我使用它时FileInputStream,FileOutputStream它运作良好.

那么我可以得出结论FileReader,FileWriter仅用于阅读和撰写文本吗?

Boz*_*zho 51

是的,你的结论是正确的子类Reader,并Writer为读/写文本内容.InputStream/ OutputStream是二进制内容.如果你看看文档:

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

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

  • 所以我只能读取.txt文件..因为pdf,word文件还包含图像文件..不是吗 (3认同)
  • @saravanan是的,只有文本文件.pdf和doc是复杂的格式,需要特殊的库才能进行有意义的解析. (3认同)

Jon*_*eet 31

FileReader(实际上任何扩展读者的东西)确实是用于文本的.来自以下文件Reader:

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

(强调我的.)看看API,你会发现它与文本有关 - char而不是byte到处都是.

InputStreamOutputStream用于二进制数据,例如mp4文件.

我个人会FileReader完全避免,因为它总是使用系统默认字符编码.相反,使用InputStreamReader围绕着FileInputStream......但只有当你要处理的文本.

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

应该在finally块中关闭IO流,这样即使在处理它们时抛出异常,它们也会关闭.


小智 6

FileInputStream用于读取原始字节数据流,如原始图像.FileReaders另一方面,用于读取字符流

FileInputStream和之间的区别FileReader是, FileInputStream逐字节FileReader读取文件并逐字符地读取文件.

所以,当你试图读取包含字符文件"?"中,FileInputStream将给出结果作为196 140,因为ASCII价值?268.

In FileReader将给出结果,268ASCIIchar 的值?.