Reader和InputStream有什么区别?

时间:2010-12-06 14:45:09

标签: java file inputstream filereader fileinputstream

Reader和InputStream有什么区别? 什么时候用? 如果我可以使用Reader来读取字符,为什么我会使用inputstream,我想读取对象?

6 个答案:

答案 0 :(得分:115)

InputStream是从资源获取信息的原始方法。它逐字节地抓取数据而不执行任何类型的转换。如果您正在读取图像数据或任何二进制文件,则这是要使用的流。

Reader专为字符流而设计。如果您正在阅读的信息都是文本,那么Reader将为您处理字符解码,并从原始输入流中为您提供unicode字符。如果您正在阅读任何类型的文本,则这是要使用的流。

您可以使用InputStreamReader类包装InputStream并将其转换为Reader。

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

答案 1 :(得分:16)

InputStreams用于从流中读取字节。因此它们对二进制数据非常有用,例如图像,视频和序列化对象。

另一方面,读者是字符流,因此它们最适合用于读取字符数据。

答案 2 :(得分:6)

我想混淆的根源是InputStream.read()返回intReader.read()也返回int

区别在于InputStream.read()返回0到255之间的字节值,对应于字节流的原始内容,Reader.read()返回0到65357之间的字符值

InputStream允许您逐字节读取内容,例如内容" a‡a"被读取为5个字节的流,即9722612816197,其中a -> U+0061 -> 0x61 -> 97和{{1 }}

A ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161可让您逐个字符地阅读内容,以便内容" a‡a"被视为3个字符Reader978225,其中97a -> U+0061 -> 0x61 -> 97

答案 3 :(得分:2)

InputStream和阅读器的背景

在Java的早期,执行控制台输入的唯一方法是使用字节流(InputStream和OutputStream)。

用例:

如今,使用字节流读取控制台流也是可以接受的。但是,对于商业应用程序,读取控制台输入的首选方法是使用面向字符的流(Reader)。 Reader使您更易于国际化和维护。

注意:这只是探索Java I / O代码的额外信息,即Java I / O实现的设计模式遵循装饰器设计模式。如果您熟悉装饰器的设计模式,那么您可以轻松地实现该实现。

答案 4 :(得分:1)

一个接受字节,另一个接受字符。

答案 5 :(得分:0)

InputStream接受字节,Reader接受字符,在Java中,一个字符=两个字节,Reader使用缓冲区,InputStream不使用。所有文件都存储在磁盘中或基于字节进行传输,包括图像和视频,但字符在内存中,因此InputStream经常使用。