C ++和C#都使用这个词stream
来命名许多类。
iostream
,istream
,ostream
,stringstream
,ostream_iterator
,istream_iterator
等等。Stream
,FileStream
,MemoryStream
,BufferedStream
等等。因此,我很想知道stream
的含义是什么?流的特征是什么?我什么时候可以用这个术语命名我的课程?这仅限于文件I / O类吗?
有趣的是,就我所知,C在任何地方都没有使用这个词。
答案 0 :(得分:74)
许多数据结构(列表,集合等)充当容器 - 它们包含一组对象。但不是流;如果列表是存储桶,则流是软管。您可以从流中提取数据,或将数据推送到流中 - 但通常仅一次且仅在一个方向(当然也有例外)。例如,网络上的TCP数据是流;你可以发送(或接收)数据块,但只能与其他计算机连接,通常只有一次 - 你无法回放互联网。
Streams还可以操纵通过它们的数据;压缩流,加密流等。但同样 - 这里隐含的隐喻是数据的软管。文件通常也作为流访问(在某种程度上);您可以访问顺序数据块。当然,大多数文件系统也提供随机访问,因此流提供诸如Seek,Position,Length等之类的东西 - 但并非所有实现都支持这样的。寻找一些流没有意义,或者获得一个开放套接字的长度。
答案 1 :(得分:4)
来自I/O Streams(虽然在java中,C ++ / C#中的含义相同)
I / O流表示输入 源或输出目的地。一个 流可以代表许多不同的 各种来源和目的地, 包括磁盘文件,设备,其他 程序和内存数组。
Streams支持许多不同的类型 数据,包括简单字节, 原始数据类型,本地化 字符和对象。一些流 简单地传递数据;其他人操纵 并以有用的方式转换数据。
无论他们如何在内部工作, 所有流都呈现同样简单 模型到使用它们的程序:A stream是一系列数据。一个 程序使用输入流来读取 来自源的数据,a中的一个项目 时间。
在C#中,您提到的流派生自抽象基类Stream。此基类的每个实现都有特定目的。
例如,FileStream支持对文件的读/写操作,而MemoryStream支持内存中的流对象。与FileStream
和MemoryStream
类不同,BufferedStream类允许用户缓冲I / O.
除了上面的类之外,还有其他几个实现Stream
类的类。有关完整列表,请参阅Stream
课程上的MSDN documentation。
答案 2 :(得分:4)
有几个不同的含义。 #1是你可能的意思,但你也可能想看#2。
在您提到的库中,“流”只是“二进制数据”的抽象,可能是也可能不是随机访问(而不是连续生成的数据,例如您正在编写一个生成随机数据的流,或者可以存储任何地方(在RAM中,在硬盘上,通过网络,在用户的大脑中等)。它们非常有用,因为它们可以让您避开细节,并编写不关心流的特定源的通用代码。
作为一种更为通用的计算机科学概念,“流”有时被认为(松散地)为“有限或无限量的数据”。如果没有示例,这个概念有点难以解释,但在函数式编程中(如在Scheme中),您可以通过将对象的历史视为变更的“流”来将具有状态的对象转换为无状态对象。 (这个想法是一个对象的状态可能会随着时间的推移而改变,但是如果你将对象的整个生命视为变化的“流”,那么整个流就不会改变,你可以用它进行函数式编程。)
答案 3 :(得分:2)
除了官方术语和解释之外, stream 这个词本身取自“现实生活”stream - 而不是水,数据从一个地方转移到另一个地方。
关于您提出的问题,仍然没有得到回答,您可以在包含流的名称中命名您自己的类,但只有在您实现某种新流时,它才具有正确的含义。
答案 4 :(得分:1)