Buffer&的区别C#中的流

时间:2017-05-12 10:33:31

标签: c# stream buffer

我读到缓冲区是字节序列。但我也读到Stream也是字节序列。那么Stream&的区别是什么?缓冲器?

2 个答案:

答案 0 :(得分:10)

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

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

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

相反:

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

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

但这只是一个准确的解释。还有更彻底的内容,例如,Marc Gravell puts it

  

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

     

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

答案 1 :(得分:1)

缓冲区具有指定的大小/长度,用于存储数据。另一方面,Stream用于从一个地方读取信息到另一个地方。例如,void addWord(char* word, trie* root) { for(int i = 0; i < strlen(word); i++) { OBJTYPE v = word[i]; if(root->children[(int)v] == NULL) { trie* node = constructor(root); node->value = v; int size = i+1; char temp[size]; printf("The value of i is : %d\n", i); printf("The value of size is : %d\n", size); printf("The copy has the size of: %d\n", strlen(temp)); strncpy(temp, word, i + 1); printf("Now the size of the copy is: %d\n", strlen(temp)); node->partWord = temp; root->children[(int)v] = node; root = node; printf("The node has value: %c\n", root->value); printf("The node stored word has size of : %d\n", strlen(root->partWord)); printf("The node has stored word: %s\n", root->partWord); } else { root = root->children[(int)v]; } } trie* end = constructor(root); end->value = '&'; char temp[strlen(word)]; strcpy(temp, word); end->partWord = temp; root->children[SIZE + 1] = end; } 用于读取和写入文件,流本身有一个缓冲区,当填充到其最大大小时,缓冲区被刷新,并且流中的数据被读取或写入。