流是什么意思?有什么特点?


70

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

  • C ++iostreamistreamostreamstringstreamostream_iteratoristream_iterator...
  • C# :Stream,,FileStream ...MemoryStreamBufferedStream

所以我很想知道,这stream是什么意思?一个的特点是stream什么?我什么时候可以用这个术语来命名我的班级?这仅限于文件I / O类吗?

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


5
+1提出一个好问题!
Nawaz

3
+1提出相同问题的另一种更正式的方式是:流的抽象数据类型是什么?
Emile Cormier

Answers:


83

许多数据结构(列表,集合等)都充当容器-它们包含一组对象。但不是溪流;如果列表是一个桶,则流是一条软管。您可以从流中提取数据,也可以将数据推入流中-但通常只能一次,并且只能在一个方向上进行(当然也有例外)。例如,网络上的TCP数据是流;您可以发送(或接收)大块数据,但是只能与另一台计算机连接,并且通常只能发送一次-您无法倒带Internet。

流还可以操纵通过它们的数据。压缩流,加密流等。但是,这里的隐喻是数据的软管。文件通常也以流的形式(在某种程度上)被访问。您可以访问顺序数据块。当然,大多数文件系统还提供随机访问,因此流确实提供了诸如“查找”,“位置”,“长度”之类的东西-但并非所有实现都支持这种功能。寻找某些流或获取打开的套接字的长度没有任何意义。


27
+1我们无法倒带互联网,但Al Gore或Chunk Norris可能会倒带。
bryanbcook 2011年

10
+1我SOOO要使用的名称hose下一次我创建了一个类似于流的类:io_hosememory_hosenetwork_hose。; P认真来说,这是一个很好的隐喻!
Emile Cormier

2
@Emile:您不会是第一个。例如,twitter使用诸如“ firehose”,“ gardenhose”和“ spritzer”之类的名称。
布莱恩(Brian)

Bryan B Cook-评论太酷了。天网不会与查克·诺里斯混为一谈,因此互联网也不会。马克-非常感谢您的简单解释。当然,有加密,这种或那种类型的编码等等。作为开发人员,我们迷失在森林中,从不问“从101的角度来看,到底什么是流?”。用一个好词来指称它会容易得多。在传达基本概念方面做得很好。
user1585204'9

5

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

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

  2. 作为更通用的计算机科学概念,有时(松散地)将“流”视为“有限或无限数量的数据”。没有示例就很难解释这个概念,但是在函数式编程(如Scheme)中,您可以通过将对象的历史视为变化的“流”,将具有状态的对象转变为无状态的对象。(其想法是对象的状态可能会随着时间而改变,但是如果将对象的整个生命视为变化的“流”,则该流作为一个整体就不会改变,并且可以使用它进行功能编程。)


4

I / O流(尽管在Java中,含义在C ++ / C#中相同)

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

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

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

在C#中,您提到的流是从抽象基类Stream派生的。此基类的每种实现都有特定的目的。

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

除了上述类之外,还有一些其他类可以实现Stream该类。有关完整列表,请参阅有关类的MSDN文档Stream


2

除了官方的术语和解释,一词本身取自“现实生活”-数据从一处转移到另一处,而不是水。

关于您提出的但仍未解决的问题,您可以使用包含流的名称来命名自己的类,但是只有在实现某种新流的情况下,它才具有正确的含义。


2

在C中定义的函数<stdio.h>在流上运行。

第7.19.2C99讨论他们的言行举止,虽然他们都没有什么,除了“字符的有序序列”。

基本原理在相应的部分中提供了更多上下文,从以下内容开始:

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

这就是概念的来源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.