FileInputStream vs FileReader

2019-01-06 11:21发布

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();

When I use the FileReader and FileWriter to read and write an mp4 file, the output.mp4 file can't be rendered well. But when I use FileInputStream and FileOutputStream instead it worked well.

So can I conclude FileReader and FileWriter are only for reading and writing text?

标签: java io writer
5条回答
趁早两清
2楼-- · 2019-01-06 11:31

FileInputStream is used for reading streams of raw bytes of data, like raw images. FileReaders, on the other hand, are used for reading streams of characters

The difference between FileInputStream and FileReader is, FileInputStream reads the file byte by byte and FileReader reads the file character by character.

So when you are trying to read the file which contains the character "Č", in FileInputStream will give the result as 196 140, because the ASCII value of Č is 268.

In FileReader will give the result as 268 which is the ASCII value of the char Č.

查看更多
Explosion°爆炸
3楼-- · 2019-01-06 11:43

"FileWriter is meant for writing streams of characters. For writing streams of raw bytes, consider using a FileOutputStream."

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

FileWriter and FileReader are desinged for Streams of chars...

best regards.

Furkan

查看更多
Juvenile、少年°
4楼-- · 2019-01-06 11:44

Yes, your conclusion is correct subclasses of Reader and Writer are for reading/writing text content. InputStream / OutputStream are for binary content. If you take a look at the documentation:

Reader - Abstract class for reading character streams

InputStream - Abstract class is the superclass of all classes representing an input stream of bytes.

查看更多
ゆ 、 Hurt°
5楼-- · 2019-01-06 11:49

FileReader (and indeed anything extending Reader) is indeed for text. From the documentation of Reader:

Abstract class for reading character streams.

(Emphasis mine.) Look at the API and you'll see it's all to do with text - char instead of byte all over the place.

InputStream and OutputStream are for binary data, such as mp4 files.

Personally I would avoid FileReader altogether though, as it always uses the system default character encoding. Instead, use InputStreamReader around a FileInputStream... but only when you want to deal with text.

As an aside, that's a very inefficient way of copying from an input to an output... use the overloads of read and write which read into or write from a buffer - either a byte[] or a char[]. Otherwise you're calling read and write for every single byte/character in the file.

You should also close IO streams in finally blocks so they're closed even if an exception is thrown while you're processing them.

查看更多
Luminary・发光体
6楼-- · 2019-01-06 11:55

A text file can be read using both fileReader and fileInputStream but mp3 and png can only be read using fileInputStream

  1. fileReader reads char by char

  2. fileInputStream reads byte by byte

查看更多
登录 后发表回答