2013-05-17 90 views
8

在Java和C#中有几个缓冲流类: BufferedStream C#,Buffered(Input|Output)StreamBuffered(Reader|Writer)缓冲流如何工作?

它们在构造函数中获取一些流并实现相同的接口。

问题是 - 它是如何工作的?

当我试图读取一个字节时会发生什么?它将大量字节读入内部缓冲区,然后在字节后将其返回给我字节?在写一个字节?写入内部缓冲区并在flush()写入内部流?

关于读取/写入字节数组 - 在缓冲流上执行操作效率不高,因为将字节复制到内部数组或从内部数组复制?

回答

2

它将很多字节读入内部缓冲区,然后在字节之后将其返回给我字节?

基本上,是的。从磁盘盘片或TCP流中请求数据需要时间,因此一次获取大量字节可能更高效,而不是试图从源单独检索它们。

+0

因此,如果我正在读取大量字节并希望在字节后读取它们的字节,而不是考虑读入缓冲区,那么缓冲流是有用的?如果我想将一个字节数组手动读入我的缓冲区,那么这种方法是无用的吗? – VorobeY1326

+2

如果您的数据源有一些请求开销,并且您想要限制请求数,缓冲流将非常有用。一个硬盘大约需要1/120秒才能完全旋转,所以如果你逐个字符地检索120个字符,最糟糕的情况是可能需要一秒钟。但是,如果您一次检索所有120个字符,则可以在一次旋转中完成。当然,你可以创建自己的缓冲区,但为什么要重新发明轮子? –

+2

请注意,.NET中的FileStream已经被充分缓冲以用于硬盘。如果您正在从套接字读取TCP数据包,则只需要'BufferedStream'或类似的东西。 –