有人能解释一下BufferedInputStream的原理吗?

3

使用BufferedOutputStream时,我认为真正的输出要等到我们使用flush方法才会发生?那么BufferedInputStream呢?它有flush方法吗?


4
大家别太苛刻了,我刚开始学编程的时候也分不清客户端和服务器的区别。这个问题并不算太糟糕。 - Raku
@Raku 哇,他继续拥有了一个相当不错的 SE 职业生涯! :D - DraxDomax
6个回答

4

在BufferedOutputStream中,真正的输出要么发生在内部缓冲区满时,要么在刷新时进行。

对于BufferedInputStream,没有刷新,因为这是没有意义的。

它会从底层流中读入大块数据到其内部缓冲区,而这个调用被认为是昂贵的,并且高效地在你请求这些数据时提供少量的数据。一旦你已经读取了一个缓冲区的数据,它自动从底层流中为您读取下一个缓冲区。因此,它的操作对您来说是完全透明的。


1

没有flush方法。Flush方法只是用于输出。


1

刷新意味着将缓冲区的完整内容写入磁盘。这只有在你写入磁盘时才有意义,而在从磁盘读取时则没有。

有些人可能会在读取上下文中使用“清除缓冲区”的说法,当他们想要出于某种原因清除缓冲区时。

但是我会称写操作为“刷新”,读操作为“清除”,以避免混淆。

术语和精确的语言在学习基础知识时非常重要。尽量养成这个习惯。它会对你有很大帮助 :)


0

这个概念是,BufferedInputStream会要求底层流以相对较大的块为单位提供数据。思想是请求大块数据比多次请求小量数据更有效率。

由于不需要写入任何内容(没有待刷新的数据),因此没有刷新方法可用。


0

每当需要读取更多数据时,都会从操作系统中进行read()。没有flush()的等效物。

最接近的是在MemoryMappedByteBuffer中,您可以在需要之前触发区域加载。


0
如果可以选择,总是使用BufferedInputStream,因为它带来了此线程中已列出的优点,并实现了mark()和reset()方法,使您能够“重复使用”流(某种程度上)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接