2011-02-28 85 views
49

C++和C#都使用这个词stream来命名许多类。流的含义是什么?它有什么特点?

  • C++:iostreamistreamostreamstringstreamostream_iteratoristream_iterator等。
  • C#:StreamFileStream,MemoryStream,BufferedStream等等。

所以它让我很好奇知道stream是什么意思?流的特征是什么?我什么时候可以用这个词来命名我的课程?这仅限于文件I/O类吗?据我所知,C不会在任何地方使用这个词。

+4

+1问一个好问题! – Nawaz 2011-02-28 16:50:22

+2

+1另一种更正式的方式来问同一个问题:什么是流的抽象数据类型? – 2011-02-28 17:33:40

回答

65

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

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

+18

+1我们不能倒带互联网,但阿尔戈尔或大块诺里斯可能。 – bryanbcook 2011-02-28 16:50:04

+5

+1我在下次创建一个类流的类:'io_hose','memory_hose','network_hose'时,会使用'hose'这个名字。 ; P尽管如此,这个伟大的比喻! – 2011-02-28 17:35:58

+1

@Emile:你不会是第一个。例如,Twitter使用诸如“firehose”,“gardenhose”和“spritzer”之类的名称。 – Brian 2011-03-03 17:15:05

3

I/O Streams(虽然在Java中,意思是在C++/C#相同)

一个I/O流表示输入 源或输出目的地。一个 流可以表示许多不同的源和目的地, 包括磁盘文件,设备,其他 程序和存储器阵列。

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

不管他们内部是如何工作的, 所有流呈现相同的简单 模型来使用这些程序:一个 流数据的序列。 A 程序使用输入流从源读取 数据,其中一个项目在 时间。

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

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

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

3

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

  1. 在像您提到的那些的库中,“流”只是为“二进制数据”的抽象,其可以是或可以不是随机存取(与数据被连续产生,如如果您正在编写生成随机数据的流),或者可以将其存储在任何地方(在RAM中,在硬盘上,通过网络,在用户的大脑中等)。它们非常有用,因为它们可以避免细节,并编写不关心流的特定源的通用代码。

  2. 作为更一般的计算机科学概念,“流”有时被认为是“有限或无限量的数据”(松散地)。没有一个例子,这个概念有点难以解释,但是在函数式编程中(例如在Scheme中),可以通过将对象的历史记录视为变化的“流”来将状态变为无状态的对象。 (其思想是对象的状态可能会随着时间而改变,但如果将对象的整个生命视为一个“流”变化,那么整个流将永远不会改变,并且可以对它进行函数式编程。)

0

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

Section 7.19.2 in C99讨论了它们如何表现,尽管不是它们是什么,除了“有序的字符序列”之外。

rationale给出了相应部分的更多方面,首先:

C派生其文本的概念,从它诞生的UNIX环境流。

所以这就是概念的来源。

2

撇开官方说法和解释,字本身是从“现实生活”stream - 取代水,数据从一个地方转移到另一个地方。

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

相关问题