C# 缓冲流是如何工作的?
在Java和C#中,有几个类用于缓冲流:C# 缓冲流是如何工作的?,c#,java,stream,buffer,encapsulation,C#,Java,Stream,Buffer,Encapsulation,在Java和C#中,有几个类用于缓冲流: BufferedStream在C#中,缓冲(输入|输出)流和缓冲(读写器) 它们在构造函数中获得一些流,并实现相同的接口 问题是——它是如何工作的 当我试图读取一个字节时会发生什么?它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我?写一个字节?写入内部缓冲区并在flush()上将其写入内部流 关于读取/写入字节数组-在缓冲流上执行此操作是否效率低下,因为会在内部数组中重复复制字节 它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我
BufferedStream
在C#中,缓冲(输入|输出)流
和缓冲(读写器)
它们在构造函数中获得一些流,并实现相同的接口
问题是——它是如何工作的
当我试图读取一个字节时会发生什么?它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我?写一个字节?写入内部缓冲区并在flush()
上将其写入内部流
关于读取/写入字节数组-在缓冲流上执行此操作是否效率低下,因为会在内部数组中重复复制字节
它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我
基本上,是的。从磁盘或TCP流请求数据需要时间,因此一次获取一整块字节比从源代码中单独检索字节更有效 所以,如果我正在读取大量字节,并且想要一个字节接一个字节地读取它们,而不是考虑读入缓冲区,缓冲流是有用的?如果我想手动将字节数组读入缓冲区,缓冲流是无用的?如果您的数据源有一些请求开销,并且您想限制请求的数量,缓冲流是有用的。硬盘驱动器完全旋转大约需要1/120秒,因此,如果你一个字符一个字符地从中检索120个字符,在最坏的情况下可能需要一整秒钟。但如果您一次检索所有120个字符,您可以在一次旋转中完成。当然,您可以创建自己的缓冲区,但为什么要重新发明轮子呢?请注意,.NET中的FileStream已经有足够的缓冲区,可以与硬盘一起使用。如果您正在从套接字或类似的东西读取TCP数据包,您只需要
BufferedStream
。不过要清楚:这是一个临时缓冲区,实际上并没有捕获流。