繁体   English   中英

Reader 和 InputStream 有什么区别?

[英]What is the difference between Reader and InputStream?

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

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

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

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

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

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

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

我想混淆的根源是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

字符 ‡在 Unicode 中被称为U+2021

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM