Reader 和 InputStream 有什么区别?什么时候用什么?如果我可以使用 Reader 读取字符,为什么我会使用 inputstream,我猜是读取对象?
5 回答
InputStream 是从资源中获取信息的原始方法。它逐字节抓取数据,而不执行任何类型的转换。如果您正在读取图像数据或任何二进制文件,这就是要使用的流。
Reader 是为字符流设计的。如果您正在阅读的信息都是文本,那么阅读器将为您处理字符解码,并从原始输入流中为您提供 unicode 字符。如果您正在阅读任何类型的文本,这就是要使用的流。
您可以使用 InputStreamReader 类包装 InputStream 并将其转换为 Reader。
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams 用于从流中读取字节。因此它们对于图像、视频和序列化对象等二进制数据很有用。
另一方面,阅读器是字符流,因此它们最适合用于读取字符数据。
我猜混淆的根源是InputStream.read()
返回 anint
并且Reader.read()
还返回 an int
。
不同之处在于InputStream.read()
返回 0 到 255 之间的字节值对应于字节流的原始内容,并Reader.read()
返回 0 到 65357 之间的字符值(因为有 65358 个不同的 unicode 代码点)
AnInputStream
允许您逐字节读取内容,例如内容“a‡a”有 3 个字符,但它在 UTF-8 中以 5 个字节编码。因此,Inputstream
您可以将其读取为 5 个字节的流(每个字节表示为int
0 到 255 之间的一个),从而导致97
, 226
, 128
,161
和97
where
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)
AReader
允许您逐个字符地读取内容,因此内容“a‡a”被读取为 3 个字符97
,8225
其中97
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97
字符 ‡ 在 Unicode 中称为U+2021
一个接受字节,另一个接受字符。
InputStream accept byte,Reader accept character, In Java, one character = two bytes , and Reader use buffer,InputStream not use. All file store in disk or transfer based on byte, include image and video, but character is in memory,so InputStream is used frequently.