Reader 和 InputStream 有啥区别?

Posted

技术标签:

【中文标题】Reader 和 InputStream 有啥区别?【英文标题】:What is the difference between Reader and InputStream?Reader 和 InputStream 有什么区别? 【发布时间】:2011-05-21 00:47:37 【问题描述】:

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

【问题讨论】:

关于“我猜想读取对象?”,有用于读取/写入 Java 对象的特殊输入/输出流。它们分别是 ObjectInputStream 和 ObjectOutputStream,是更大的序列化框架的一部分。 java.sun.com/developer/technicalArticles/Programming/… 但这只是输入/输出流的一种用途,其他可能是通过套接字发送数据等。 【参考方案1】:

我猜混淆的根源在于InputStream.read() 返回一个int,而Reader.read() 也返回一个int

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

InputStream 允许您逐字节读取内容,例如内容“a‡a”有 3 个字符,但它以 UTF-8 编码为 5 个字节。因此,使用Inputstream,您可以将其读取为 5 个字节的流(每个字节表示为介于 0 和 255 之间的 int)导致 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 允许您逐个字符地读取内容,因此内容“a‡a”被读取为 3 个字符 97822597 其中

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

字符‡称为U+2021 in Unicode

【讨论】:

这应该是公认的答案。谢谢你的例子【参考方案2】:

InputStream 接受字节,Reader 接受字符,Java 中,1 个字符 = 2 个字节,Reader 使用缓冲区,InputStream 不使用。所有文件都存储在磁盘中或按字节传输,包括图像和视频,但字符在内存中,因此 InputStream 被频繁使用。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

完美的答案贝林!谢谢!【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Reader 和 InputStream 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

InputStream和Reader

Java InputStream和Reader

InputSource 和 InputStream 有啥区别? [复制]

Java FileInputStream与FileReader的区别

在创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有啥区别

InputStream,InputStreamReader和Reader的关系