Reader和InputStream有什么区别?


87

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


3
关于“我想读取对象?”,有一些特殊的Input / Output流用于读取/写入Java对象。它们分别是ObjectInputStream和ObjectOutputStream,并且是较大的序列化框架的一部分。 java.sun.com/developer/technicalArticles/Programming/... 但是,这只是一个使用的输入/输出流,其他人可以通过套接字来发送数据等
马克·彼得斯

Answers:


138

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

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

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

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

完美答案贝林!谢谢!
加拉夫

18

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

另一方面,读取器是字符流,因此最好用于读取字符数据。


什么时候使用read()逐字节,什么时候使用read(byte[])字节数组。我认为阅读数组总是更好。那么可以举个例子,在哪里使用read()逐字节或字节 read(byte[])数组。或者 BufferedInputStream。?
Asif Mushtaq

11

我想混乱的根源是InputStream.read()返回,int并且Reader.read()还返回int

区别在于,InputStream.read()返回的字节值在0到255之间,与字节流的原始内容相对应,并且Reader.read()返回的字符值在0到65357之间(因为存在65358个不同的unicode码点)

一个InputStream可让您读取的内容逐字节,例如,内容“一‡一个”读为5个字节(表示为每一个流int0到255之间),从而导致9722612816197其中

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

一个Reader可以让你通过文字这样的内容“一‡一个”读为3个字符阅读的内容,性质97822597在那里

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

字符‡在Unicode中称为U + 2021


这应该是公认的答案。谢谢您的示例
仪表板

2

InputStream和阅读器的背景:

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

用例:

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

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



0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.