2017-05-12 103 views
1

我读过缓冲区是字节序列。但是我也读过Stream也是bytes.so的区别流&缓冲区有什么区别?C#中缓冲区和流之间的区别

+0

缓冲区具有指定的确定长度,而流不具有指定的确定长度。 – ThePerplexedOne

+3

流是读取和/或写入的字节序列,而缓冲区是存储的字节序列。 – Abion47

+1

@ Abion47正如你所说的缓冲区是为了存储字节序列,所以我的问题是流不存储在内存中? –

回答

0

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

FileStream stream = new FileStream("filepath.txt",FileMode.open); 

打开一个流到一个文件。该流可以从中读取,写入或两者兼有。因为它不需要任何额外的内存,所以它轻量且快速,但在源中任意引用特定的一组数据可能会很麻烦。流也可以从连接而不是离散的数据集中受益,因此您无需事先知道数据的大小。

相反地:

byte[] fileContents = File.ReadAllBytes("filepath.txt"); 

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

虽然这只是一个准系统的解释。还有更彻底的在那里,例如,Marc Gravell puts it

许多数据结构(列表,收藏品等)作为容器 - 他们持有一组对象。但不是流;如果列表是一个桶,那么流是一个软管。您可以从数据流中提取数据,或将数据推送到数据流中 - 但通常只能在一个方向上进行(当然也有例外)。例如,网络上的TCP数据是一个流;您可以发送(或接收)大量数据,但只能与其他计算机连接,并且通常只能使用一次 - 您无法倒带互联网。

流也可以操纵通过它们的数据;压缩码流,加密码流等等。但是,这里隐含的隐喻是数据管道。一个文件通常也被作为一个流访问(在某个级别);您可以访问连续数据块。当然,大多数文件系统也提供随机访问,所以流确实提供了Seek,Position,Length等等 - 但并不是所有的实现都支持这样的。寻找一些流,或者获得一个开放套接字的长度没有意义。

+0

我也读过这个流有它的内部缓冲区。什么是内部缓冲区的使用和使用它的地方。 –

+0

@neelmaheta流一般没有内部缓冲区。 _特定种类的stream_有时可以做,比如'BufferedStream'或'MemoryStream'。 – Abion47

+0

我看到所有流都有其默认大小的内部缓冲区。您可以通过在默认缓冲区大小中传递它的值来更改默认缓冲区大小。在visual studio express edition 2013中的调试模式下,我看到了这一点 –

0

缓冲区具有指定的大小/长度,用于存储数据。另一方面,Stream用于读取和写入从一个地方到另一个地方的信息。例如FileStream用于读写文件,流自身具有一个缓冲区,当填充到其最大大小时缓冲区将被刷新并读取或写入流中的数据。

相关问题