Reader和InputStream有什么区别?什么时候使用什么?如果我可以使用Reader读取字符,为什么要使用inputstream,我想读取对象吗?
Answers:
InputStream是从资源获取信息的原始方法。它不执行任何类型的转换就逐字节地获取数据。如果您正在读取图像数据或任何二进制文件,则这是要使用的流。
阅读器是为字符流设计的。如果您正在阅读的信息全部为文本,则阅读器将为您处理字符解码,并为您提供原始输入流中的unicode字符。如果您正在阅读任何类型的文本,则这是要使用的流。
您可以包装InputStream并通过使用InputStreamReader类将其转换为Reader。
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams用于从流中读取字节。因此,它们对于二进制数据(例如图像,视频和序列化对象)很有用。
另一方面,读取器是字符流,因此最好用于读取字符数据。
read()
逐字节,什么时候使用read(byte[])
字节数组。我认为阅读数组总是更好。那么可以举个例子,在哪里使用read()
逐字节或字节 read(byte[])
数组。或者 BufferedInputStream
。?
我想混乱的根源是InputStream.read()
返回,int
并且Reader.read()
还返回int
。
区别在于,InputStream.read()
返回的字节值在0到255之间,与字节流的原始内容相对应,并且Reader.read()
返回的字符值在0到65357之间(因为存在65358个不同的unicode码点)
一个InputStream
可让您读取的内容逐字节,例如,内容“一‡一个”读为5个字节(表示为每一个流int
0到255之间),从而导致97
,226
,128
,161
和97
其中
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个字符阅读的内容,性质97
,8225
并97
在那里
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97