C#中缓冲区和流之间的区别

Nee*_*eta 12 c# buffer stream

我读到缓冲区是字节序列.但我也读到Stream也是字节序列.那么Stream和Buffer之间有什么区别?

Abi*_*n47 11

正如我在评论中所说,缓冲区和流之间的区别在于流是从指定源传输信息或向指定源传输信息的序列,而缓冲区是存储在内存中的字节序列.例如:

FileStream stream = new FileStream("filepath.txt", FileMode.OpenOrCreate);
Run Code Online (Sandbox Code Playgroud)

打开文件流.该流可以从,写入或同时读取.由于它不需要任何额外的内存,因此它重量轻且速度快,但在源代码中任意引用一组特定的数据可能很麻烦.Streams也可以从连接而不是离散的数据集中受益,因此您无需事先知道数据的大小.

反过来:

byte[] fileContents = File.ReadAllBytes("filepath.txt");
Run Code Online (Sandbox Code Playgroud)

将文件的所有字节读入内存.当您需要一次操作整个文件,或者为程序保留"本地副本"以便文件可以免费用于其他用途时,这非常方便.但是,根据源的大小和可用内存量,包含整个文件的缓冲区可能不是一个选项.

不过,这只是一个准确的解释.那里有更彻底的,例如,正如Marc Gravell所说:

许多数据结构(列表,集合等)充当容器 - 它们拥有一组对象.但不是流; 如果列表是存储桶,则流是软管.您可以从流中提取数据,或将数据推送到流中 - 但通常只能在一个方向上进行一次(当然也有例外).例如,网络上的TCP数据是流; 您可以发送(或接收)数据块,但只能与其他计算机连接,通常只能连接一次 - 您无法回放Internet.

Streams还可以操纵通过它们的数据; 压缩流,加密流等.但同样 - 这里隐含的隐喻是数据的软管.文件通常也作为流访问(在某种程度上); 您可以访问顺序数据块.当然,大多数文件系统也提供随机访问,因此流提供诸如Seek,Position,Length等之类的东西 - 但并非所有实现都支持这样的.寻找一些流没有意义,或者获得一个开放套接字的长度.