Reader和InputStream有什么区别? 什么时候用? 如果我可以使用Reader来读取字符,为什么我会使用inputstream,我想读取对象?
答案 0 :(得分:115)
InputStream是从资源获取信息的原始方法。它逐字节地抓取数据而不执行任何类型的转换。如果您正在读取图像数据或任何二进制文件,则这是要使用的流。
Reader专为字符流而设计。如果您正在阅读的信息都是文本,那么Reader将为您处理字符解码,并从原始输入流中为您提供unicode字符。如果您正在阅读任何类型的文本,则这是要使用的流。
您可以使用InputStreamReader类包装InputStream并将其转换为Reader。
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
答案 1 :(得分:16)
InputStreams用于从流中读取字节。因此它们对二进制数据非常有用,例如图像,视频和序列化对象。
另一方面,读者是字符流,因此它们最适合用于读取字符数据。
答案 2 :(得分:6)
我想混淆的根源是InputStream.read()
返回int
而Reader.read()
也返回int
。
区别在于InputStream.read()
返回0到255之间的字节值,对应于字节流的原始内容,Reader.read()
返回0到65357之间的字符值
InputStream
允许您逐字节读取内容,例如内容" a‡a"被读取为5个字节的流,即97
,226
,128
,161
和97
,其中a -> U+0061 -> 0x61 -> 97
和{{1 }}
A ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161
可让您逐个字符地阅读内容,以便内容" a‡a"被视为3个字符Reader
,97
和8225
,其中97
和a -> 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经常使用。