流意味着什么?它的特点是什么?

时间:2011-02-28 16:39:44

标签: c# c++ class stream nomenclature

C ++和C#都使用这个词stream来命名许多类。

  • C ++:iostreamistreamostreamstringstreamostream_iteratoristream_iterator等等。
  • C#:StreamFileStreamMemoryStreamBufferedStream等等。

因此,我很想知道stream的含义是什么?流的特征是什么?我什么时候可以用这个术语命名我的课程?这仅限于文件I / O类吗?

有趣的是,就我所知,C在任何地方都没有使用这个词。

5 个答案:

答案 0 :(得分:74)

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

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

答案 1 :(得分:4)

来自I/O Streams(虽然在java中,C ++ / C#中的含义相同)

  

I / O流表示输入   源或输出目的地。一个   流可以代表许多不同的   各种来源和目的地,   包括磁盘文件,设备,其他   程序和内存数组。

     

Streams支持许多不同的类型   数据,包括简单字节,   原始数据类型,本地化   字符和对象。一些流   简单地传递数据;其他人操纵   并以有用的方式转换数据。

     

无论他们如何在内部工作,   所有流都呈现同样简单   模型到使用它们的程序:A   stream是一系列数据。一个   程序使用输入流来读取   来自源的数据,a中的一个项目   时间。

在C#中,您提到的流派生自抽象基类Stream。此基类的每个实现都有特定目的。

例如,FileStream支持对文件的读/写操作,而MemoryStream支持内存中的流对象。与FileStreamMemoryStream类不同,BufferedStream类允许用户缓冲I / O.

除了上面的类之外,还有其他几个实现Stream类的类。有关完整列表,请参阅Stream课程上的MSDN documentation

答案 2 :(得分:4)

有几个不同的含义。 #1是你可能的意思,但你也可能想看#2。

  1. 在您提到的库中,“流”只是“二进制数据”的抽象,可能是也可能不是随机访问(而不是连续生成的数据,例如您正在编写一个生成随机数据的流,或者可以存储任何地方(在RAM中,在硬盘上,通过网络,在用户的大脑中等)。它们非常有用,因为它们可以让您避开细节,并编写不关心流的特定源的通用代码。

  2. 作为一种更为通用的计算机科学概念,“流”有时被认为(松散地)为“有限或无限量的数据”。如果没有示例,这个概念有点难以解释,但在函数式编程中(如在Scheme中),您可以通过将对象的历史视为变更的“流”来将具有状态的对象转换为无状态对象。 (这个想法是一个对象的状态可能会随着时间的推移而改变,但是如果你将对象的整个生命视为变化的“流”,那么整个流就不会改变,你可以用它进行函数式编程。)

答案 3 :(得分:2)

除了官方术语和解释之外, stream 这个词本身取自“现实生活”stream - 而不是水,数据从一个地方转移到另一个地方。

关于您提出的问题,仍然没有得到回答,您可以在包含流的名称中命名您自己的类,但只有在您实现某种新流时,它才具有正确的含义。

答案 4 :(得分:1)

<stdio.h>中定义的C函数对流进行操作。

C99中的第7.19.2节 Streams 讨论了它们的行为方式,但不是它们是什么,除了“有序的字符序列”。

rationale在相应部分中提供了更多上下文,从:

开始
  

C继承了它诞生的UNIX环境中的文本流概念。

这就是概念的来源。