Java中InputStream.read(字节b)和BufferedInputStream之间的差异

Java中InputStream.read(字节b)和BufferedInputStream之间的差异,java,inputstream,bufferedinputstream,Java,Inputstream,Bufferedinputstream,我刚刚看到,InputStream()类有一个方法read(byte[]b)来按字节读取数据流。这不是一种“缓冲读取”吗 我进一步看到,BufferedInputStream(没有自己的read(byte[]b))实现。它使用其父类的方法FilterInputStream 那么,InputStream类是否也支持缓冲读取?与类BufferedInputStream的区别在哪里 编辑 将“read(byte b)”更正为“read(byte[]b)”我假定您的意思是byte[]b,而不是byte

我刚刚看到,
InputStream
()类有一个方法
read(byte[]b)
来按字节读取数据流。这不是一种“缓冲读取”吗

我进一步看到,
BufferedInputStream
(没有自己的
read(byte[]b)
)实现。它使用其父类的方法
FilterInputStream

那么,
InputStream
类是否也支持缓冲读取?与类
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
方法,它有效地允许您将流中的一个点作为书签并从该书签中重新读取。缓冲区保留支持此操作所需的字节。否则,它将只读取所需的字节当时可用,没有任何缓冲。

接口也是如此,BufferedInputStream是一个实现。 BufferedInputStream环绕另一个InputStream,如FileInputStream和buffers数据。 BufferedInputStream所做的是,它在返回之前收集多个字节块,以便您可以一次读取更大的数据块以提高性能


你可以看看这个。

InputStream
是一个抽象类,不是一个接口!它确实提供了一个
read(byte)
方法。这是一个缓冲区,不是吗?区别在于当你使用InputStream读取一个或一个字节缓冲区时,它只读取那个或这些字节(最大值),仅此而已。当使用BufferedInputStream时,读取单个字节或字节缓冲区实际上会加载更大的字节块并将其保存在内存中,以便下次读取时随时可用。因此,如果使用FileInputStream从文件逐字节读取,或使用FileInputStream从文件逐10字节读取,则会进行大量文件系统读取,而如果使用BufferedInputStream,第一次读取实际上会从文件系统中读取8Kb的数据,下一次读取只会从内存中的缓冲区中读取数据,使其速度更快。简言之,它的行为与javadoc中描述的一样,您应该读取。在API中没有提到任何内容,“
read(byte[]b)
只是调用
read(b,0,b.length)
“?!我只能读到”类InputStream的read(b)方法与:read(b,0,b.length)具有相同的效果“。请参阅:好的。谢谢!但是,确实如此,例如,
InputStream.read(byte[]b)
byte[]b=新字节[1024]
也执行一种“缓冲读取”,因此一次从文件系统读取1024字节?@mrbela请阅读我的评论,在您的问题下。BufferedInputStream使用内部缓冲区,无论您是否一次读取一个字节,还是一次读取N个字节,都会使用该缓冲区;这就是缓冲流的原因。同时,请阅读javadoc,这也解释了同样的问题。