流是啥意思?它有啥特点?
Posted
技术标签:
【中文标题】流是啥意思?它有啥特点?【英文标题】:What does stream mean? What are its characteristics?流是什么意思?它有什么特点? 【发布时间】:2011-07-05 21:54:17 【问题描述】:C++ 和 C# 都使用单词stream
来命名许多类。
iostream
、istream
、ostream
、stringstream
、ostream_iterator
、istream_iterator
...
C#:Stream
、FileStream
、MemoryStream
、BufferedStream
...
所以我很想知道,stream
是什么意思?
stream
的特点是什么?
我什么时候可以用这个词来命名我的课程?
这是否仅限于文件 I/O 类?
有趣的是,据我所知,C 并没有在任何地方使用这个词。
【问题讨论】:
+1 提出了一个好问题! +1 提出同样问题的另一种更正式的方式是:流的抽象数据类型是什么? 【参考方案1】:许多数据结构(列表、集合等)充当容器 - 它们包含一组对象。但不是溪流;如果列表是桶,那么流就是软管。您可以从流中提取数据,或将数据推送到流中 - 但通常仅一次并且仅在一个方向(当然也有例外)。例如,网络上的 TCP 数据是流;您可以发送(或接收)数据块,但只能与另一台计算机连接,而且通常只能发送一次 - 您不能回退 Internet。
流也可以操作通过它们的数据;压缩流、加密流等。但同样 - 这里的基本隐喻是数据软管。文件通常也作为流(在某种程度上)被访问;您可以访问顺序数据块。当然,大多数文件系统也提供随机访问,因此流确实提供了诸如 Seek、Position、Length 等内容——但并非所有实现都支持这些内容。寻找一些流,或获取打开的套接字的长度是没有意义的。
【讨论】:
+1 我们不能倒带互联网,但阿尔·戈尔或 Chunk Norris 可以。 +1 我将在下次创建类似流的类时使用名称hose
:io_hose
、memory_hose
、network_hose
。 ;P 说真的,不过,很好的比喻!
@Emile:你不会是第一个。例如,推特使用“firehose”、“gardenhose”和“spritzer”等名称。
Bryan B Cook -- 评论太酷了。 SkyNet 不会惹恼 Chuck Norris,所以 Internet 也不会。 Marc - 非常感谢您的简单解释。当然,有加密,这种或那种类型的编码等。作为开发人员,我们迷失在森林中,从不问“无论如何,从 101 意义上来说,流到底是什么?”。用一个好的术语来指代它,用它来思考要容易得多。在传达基本概念方面做得很好。【参考方案2】:
有几个不同的含义。 #1 可能是您的意思,但您可能也想查看 #2。
在您提到的那些库中,“流”只是“二进制数据”的抽象,可能是也可能不是随机访问(与连续生成的数据相反,例如如果您正在编写一个生成随机数据的流),或者可能存储在任何地方(在 RAM、硬盘上、通过网络、在用户的大脑中等)。它们很有用,因为它们可以让您避免细节,并编写不关心流的特定来源的通用代码。
作为更一般的计算机科学概念,“流”有时被认为(松散地)为“有限或无限量的数据”。如果没有示例,这个概念有点难以解释,但在函数式编程中(如在 Scheme 中),您可以通过将对象的历史视为更改的“流”,将具有状态的对象转换为无状态对象。 (这个想法是对象的状态可能会随着时间而改变,但是如果将对象的整个生命周期视为变化的“流”,则整个流永远不会改变,您可以使用它进行函数式编程。)
【讨论】:
【参考方案3】:来自I/O Streams(虽然在java中,在C++/C#中含义相同)
一个 I/O 流代表一个输入 源或输出目标。一种 流可以代表许多不同的 来源和目的地的种类, 包括磁盘文件、设备、其他 程序和内存数组。
流支持多种不同的类型 数据,包括简单字节, 原始数据类型,本地化 人物和对象。一些流 简单地传递数据;别人操纵 并以有用的方式转换数据。
无论他们在内部如何运作, 所有流都呈现相同的简单 使用它们的程序的模型:A 流是一个数据序列。一种 程序使用输入流读取 来自一个来源的数据,一个项目 时间。
在 C# 中,您提到的流派生自抽象基类 Stream。这个基类的每个实现都有一个特定的目的。
例如,FileStream 支持对文件的读/写操作,而MemoryStream 则适用于内存中的流对象。与 FileStream
和 MemoryStream
类不同,BufferedStream 类允许用户缓冲 I/O。
除了上述类之外,还有其他几个类实现了Stream
类。如需完整列表,请参阅 Stream
类上的 MSDN documentation。
【讨论】:
【参考方案4】:除了官方术语和解释,流这个词本身取自“现实生活”stream - 不是水,而是数据从一个地方传输到另一个地方。
关于您提出但仍未得到答复的问题,您可以用包含流的名称命名您自己的类,但只有实现某种新流时,它才会具有正确的含义。
【讨论】:
【参考方案5】:<stdio.h>
中定义的 C 函数对流进行操作。
C99 中的第 7.19.2 节 Streams 讨论了它们的行为方式,尽管不是它们是什么,除了“有序的字符序列”。
rationale 在相应部分提供了更多上下文,开头为:
C 从它诞生的 UNIX 环境中继承了它的文本流概念。
这就是这个概念的由来。
【讨论】:
以上是关于流是啥意思?它有啥特点?的主要内容,如果未能解决你的问题,请参考以下文章