Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 缓冲流是如何工作的?_C#_Java_Stream_Buffer_Encapsulation - Fatal编程技术网

C# 缓冲流是如何工作的?

C# 缓冲流是如何工作的?,c#,java,stream,buffer,encapsulation,C#,Java,Stream,Buffer,Encapsulation,在Java和C#中,有几个类用于缓冲流: BufferedStream在C#中,缓冲(输入|输出)流和缓冲(读写器) 它们在构造函数中获得一些流,并实现相同的接口 问题是——它是如何工作的 当我试图读取一个字节时会发生什么?它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我?写一个字节?写入内部缓冲区并在flush()上将其写入内部流 关于读取/写入字节数组-在缓冲流上执行此操作是否效率低下,因为会在内部数组中重复复制字节 它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我

在Java和C#中,有几个类用于缓冲流:
BufferedStream
在C#中,
缓冲(输入|输出)流
缓冲(读写器)

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

问题是——它是如何工作的

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

关于读取/写入字节数组-在缓冲流上执行此操作是否效率低下,因为会在内部数组中重复复制字节

它将大量字节读入内部缓冲区,然后一个字节接一个字节地返回给我


基本上,是的。从磁盘或TCP流请求数据需要时间,因此一次获取一整块字节比从源代码中单独检索字节更有效

所以,如果我正在读取大量字节,并且想要一个字节接一个字节地读取它们,而不是考虑读入缓冲区,缓冲流是有用的?如果我想手动将字节数组读入缓冲区,缓冲流是无用的?如果您的数据源有一些请求开销,并且您想限制请求的数量,缓冲流是有用的。硬盘驱动器完全旋转大约需要1/120秒,因此,如果你一个字符一个字符地从中检索120个字符,在最坏的情况下可能需要一整秒钟。但如果您一次检索所有120个字符,您可以在一次旋转中完成。当然,您可以创建自己的缓冲区,但为什么要重新发明轮子呢?请注意,.NET中的FileStream已经有足够的缓冲区,可以与硬盘一起使用。如果您正在从套接字或类似的东西读取TCP数据包,您只需要
BufferedStream
。不过要清楚:这是一个临时缓冲区,实际上并没有捕获流。