stream是什么意思? 它有什么特点?

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

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

所以这让我很好奇知道stream是什么意思? stream的特征是什么? 我什么时候可以用这个词来命名我的课程? 这仅限于文件I / O类吗?

有趣的是,据我所知,C不会在任何地方使用这个词。

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

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

从I / Ostream (尽pipe在Java中,在C ++ / C#中的含义是相同的)

I / Ostream表示input源或输出目标。 stream可以表示许多不同types的源和目标,包括磁盘文件,设备,其他程序和内存数组。

stream支持许多不同types的数据,包括简单字节,原始数据types,本地化字符和对象。 有些stream只是传递数据。 其他人以有用的方式操作和转换数据。

无论内部是如何工作的,所有stream都使用相同的简单模型:程序stream是一系列数据。 程序使用inputstream从源读取数据,一次一个项目。

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

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

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

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

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

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

除了官方的说法和解释之外,“ stream ”这个词本身是从“现实生活”的stream向中取得的 ,而不是水,数据从一个地方转移到另一个地方。

关于你问的问题,仍然没有被回答,你可以用包含stream的名字来命名你自己的类,但是只有当你实现某种新的stream时才会有正确的含义。

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

第7.19.2节C99中的数据stream讨论了它们如何performance,尽pipe不是它们是什么,除了“有序的字符序列”之外。

基本原理在相应的部分给出了更多的背景,从以下开始:

C从其出生的UNIX环境中inheritance了它的文本stream的概念。

所以这就是这个概念的来源。