InputStream.read(byte b) 和 Java 中的 BufferedInputStream 之间的区别
Difference between InputStream.read(byte b) and BufferedInputStream in Java
我刚刚看到 InputStream
(link to Java 11 API) class 有一个方法 read(byte[] b)
可以按字节方式读取数据流。这不就是一种“缓冲阅读”吗?
我进一步看到,BufferedInputStream
(link to Java 11 API) 没有自己的 read(byte[] b)
实现。它正在使用其父 class FilterInputStream
.
那么,InputStream
class 是否也支持缓冲读取? class BufferedInputStream
的区别在哪里?
编辑
将“read(byte b)
”更正为“read(byte[] b)
”。
我假设你的意思是 byte[] b
,而不是 byte b
。
根据 Javadoc,read(byte[] b)
的默认实现只是调用 read(b, 0, b.length)
。由于此方法在 BufferedInputStream
中被覆盖,您可以说 read(byte[] b)
出于所有意图和目的也被覆盖。
BufferedInputStream
提供的附加功能是对 mark
和 reset
方法的支持,这有效地允许您在流中为一个点添加书签并从该书签重新读取.缓冲区维护支持此操作所需的字节。否则,它将只读取当时可用的内容,没有任何缓冲。
所以InputStream是一个接口,BufferedInputStream是一个实现。
BufferedInputStream 环绕另一个 InputStream,如 FileInputStream 并缓冲数据。
BufferedInputStream 所做的是它在 return 之前收集多个字节块,以便您可以一次读取更大的数据块以提高性能。
你可以看看这个optimization example。
我刚刚看到 InputStream
(link to Java 11 API) class 有一个方法 read(byte[] b)
可以按字节方式读取数据流。这不就是一种“缓冲阅读”吗?
我进一步看到,BufferedInputStream
(link to Java 11 API) 没有自己的 read(byte[] b)
实现。它正在使用其父 class FilterInputStream
.
那么,InputStream
class 是否也支持缓冲读取? class BufferedInputStream
的区别在哪里?
编辑
将“read(byte b)
”更正为“read(byte[] b)
”。
我假设你的意思是 byte[] b
,而不是 byte b
。
根据 Javadoc,read(byte[] b)
的默认实现只是调用 read(b, 0, b.length)
。由于此方法在 BufferedInputStream
中被覆盖,您可以说 read(byte[] b)
出于所有意图和目的也被覆盖。
BufferedInputStream
提供的附加功能是对 mark
和 reset
方法的支持,这有效地允许您在流中为一个点添加书签并从该书签重新读取.缓冲区维护支持此操作所需的字节。否则,它将只读取当时可用的内容,没有任何缓冲。
所以InputStream是一个接口,BufferedInputStream是一个实现。 BufferedInputStream 环绕另一个 InputStream,如 FileInputStream 并缓冲数据。 BufferedInputStream 所做的是它在 return 之前收集多个字节块,以便您可以一次读取更大的数据块以提高性能。
你可以看看这个optimization example。