流式是什么?它有哪些特点?

86

C++C#都使用单词stream来命名许多类。

  • C++iostreamistreamostreamstringstreamostream_iteratoristream_iterator等...
  • C#StreamFileStreamMemoryStreamBufferedStream等...

所以我很好奇,stream是什么意思呢? stream的特点是什么? 我什么时候可以用这个词来命名我的类? 这是否仅限于文件I / O类?

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


8
谢谢你提出这个好问题!加一分! - Nawaz
3
另一种更正式的询问同一个问题的方式是:流的抽象数据类型是什么? - Emile Cormier
我还没有阅读答案,但是想要赞扬这个好问题,谢谢。这正是我来到这里的原因。 - Emmanuel Motsi
5个回答

103
许多数据结构(列表、集合等)充当容器 - 它们保存一组对象。但流不同;如果列表是一个桶,那么流就像一根水管。您可以从流中获取数据或向流中推送数据 - 但通常只能在一个方向上进行一次(当然也有例外情况)。例如,网络上传输的TCP数据就是流;您可以发送(或接收)数据块,但只能与其他计算机建立连接,并且通常只能发送一次 - 您无法回放互联网。
流还可以操作经过它们的数据;压缩流、加密流等。但是-这里的基本隐喻仍是数据的水管。文件通常也被视为流的形式访问;您可以访问一系列数据块。当然,大多数文件系统也提供了随机访问功能,因此流也提供了像Seek、Position、Length等的功能 - 但并非所有实现都支持这些功能。对于某些流来说,寻求特定位置或获取开放套接字的长度是没有意义的。

28
+1 我们无法倒带互联网,但阿尔·戈尔或查克·诺里斯可能可以。 - bryanbcook
14
+1 我下次创建类似流的类时一定会使用“hose”这个名称:io_hosememory_hosenetwork_hose。开玩笑,不过这个隐喻真的很棒! - Emile Cormier
2
@Emile:你不会是第一个这样做的人。例如,Twitter 使用像“firehose”、“gardenhose”和“spritzer”这样的名称。 - Brian
Bryan B Cook - 太酷了。SkyNet不会惹恼查克·诺里斯,因此互联网也不会。Marc - 非常感谢您提供简单的解释。当然,有加密、这种或那种类型的编码等等。作为开发人员,我们在森林中迷失了方向,从未问过“什么是流,在101意义上?”。有一个好术语来指称它,思考起来就容易得多了。在传达基本概念方面做得很好。 - user1585204

7

I/O Streams(尽管在Java中,意义与C++/C#相同)

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

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

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

在C#中,你提到的流源于抽象基类Stream。每个此基类的实现都具有特定的目的。

例如,FileStream 支持对文件的读/写操作,而 MemoryStream 则针对内存流对象工作。与 FileStreamMemoryStream 类不同,BufferedStream 类允许用户缓冲 I/O。
除了上述类之外,还有几个实现了 Stream 类的其他类。要获取完整列表,请参阅 Stream 类的 MSDN 文档

7
有几个不同的意思。 #1 是你可能想要的,但你也可以看看 #2。
- 在像你提到的那些库中,“流”只是“二进制数据”的抽象,可能是随机访问的(与连续生成的数据相反,例如如果你编写一个生成随机数据的流),或者可能存储在任何地方(在 RAM 中,在硬盘上,在网络上,在用户的大脑中等)。它们很有用,因为它们让你避免细节,并编写不关心流的特定来源的通用代码。
- 作为一种更一般的计算机科学概念,“流”有时被认为是“有限或无限数量的数据”。这个概念有点难以解释,但在函数式编程(比如Scheme)中,你可以通过将对象的状态视为“变化的流”来将带状态的对象转换为无状态对象。(这个想法是对象的状态可能随时间而改变,但如果你将对象的整个生命周期视为“变化的流”,那么流作为一个整体永远不会改变,你可以使用它进行函数式编程。)

3
在C语言中,<stdio.h>中定义的函数操作流。

C99的第7.19.2节“流”讨论了它们的行为,尽管没有说明它们是什么,除了“有序字符序列”。 Rationale在相应的部分中提供了更多背景信息,开始于以下内容:

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

因此,这就是该概念的来源。

2

除了官方术语和解释之外,stream这个词本身是从“现实生活”中的中取的灵感 - 数据从一个地方传输到另一个地方,就像水流一样。

关于你提出但仍未回答的问题,只有在实现某种新的流时,您才可以在名称中使用包含stream的术语来命名自己的类,这样才能正确理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接