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

Kas*_*hif 63 c# c++ terminology class stream

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

  • C++: ,iostream,istream,ostream,,stringstream 等.ostream_iteratoristream_iterator
  • C#: , Stream,,FileStream 等等.MemoryStreamBufferedStream

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

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

Mar*_*ell 74

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

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

  • +1我们无法回放互联网,但Al Gore或Chunk Norris可能. (26认同)
  • +1下次我创建类似流的类时,我将使用名称`hose`:`io_hose`,`memory_hose`,`network_hose`.;但是,严肃地说,这是一个很好的比喻! (10认同)
  • @Emile:你不会是第一个.例如,twitter使用"firehose","gardenhose"和"spritzer"等名称. (2认同)

Dev*_*van 7

来自I/O Streams(尽管在 java 中,含义与 C++ / C# 中相同)

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

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

无论它们内部如何工作,所有流都向使用它们的程序呈现相同的简单模型:流是数据序列。程序使用输入流从源读取数据,一次读取一项。

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

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

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


Meh*_*dad 6

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

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

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