“流”的基础结构

时间:2009-07-24 23:30:17

标签: stream

被称为“流”的概念的基础构造是什么?他们如何在内部工作?

内存流如何工作?

文件流如何运作?

编辑 - 从答案我猜测每种类型的流的实现方式不同,但核心概念是由一个类或一组函数控制和建模的字节序列。这是对的吗?

3 个答案:

答案 0 :(得分:1)

维基百科的这个定义怎么样:http://en.wikipedia.org/wiki/Stream_(computing)

答案 1 :(得分:0)

“流”的概念只是由一个类封装的字节序列,该类跟踪流的长度,当前位置,“对象”或字节数等...并提供来回寻找对象流(或字节等......)

因此,你所说的底层“构造”只是一个字节数组(或磁盘上的文件或指向类,结构甚至整数类型的指针),它根据流“服务”它上面的对象封装

想象一下,我有10只橡皮鸭,我站在一个真正的现实世界的水流旁边。我在河里放了一只鸭子,它开始向下游漂浮。我现在在河上有一只鸭子。我在流中放了另一只鸭子,它开始向下游漂浮。我现在在流上有两只鸭子。这种情况一直持续到......你内存不足。现在我向下游跑,从水中抓住第二只鸭子(寻找)。现在流中有9只鸭子,我在第2位......

因此,流式传输对象不同于将其放置在数组或列表中,因为它可以由封装流类“操作”。

流媒体的优点在于,您可以在其他流之上创建不同的流,从而实现一定程度的抽象。例如在.NET中,我可以在FileStream之上创建一个StreamWriter,它允许我将字符串写入文件流,而不必手动将它们转换为字节数组。

希望这会有所帮助。随意纠正或添加任何必要的东西。我并不自称是专家。

(顺便说一下,没有必要迟钝,声称“太笼统”,“我不明白”等等......让我们多一点理解和礼貌,从我们的讲坛上下来并解释一下合理的时尚。)

答案 2 :(得分:0)

我假设您对C#FileStreamMemoryStream(或他们在Java中的类似物以及其他类似语言/框架)感兴趣。

内存流通过流接口公开连续的内存块。这通常实现为数组和指示当前字节的索引(或指针)。内存流可以不增长,在这种情况下,数组的大小是预先定义的,并且不能改变和增长,在这种情况下,如果现有数组不适合数据,则分配新数组,并复制内存。作为优化,对于增长的流,阵列通常被分配的大小大于保存流中当前所有数据所需的大小 - 这样,当您最终写入更多数据时,可以快速使用未使用的空间,而不需要用于每次写入时的数组重新分配。通过此优化,除了大小之外,流还需要跟踪阵列中未使用的空间量。

文件流通常要简单得多,因为操作系统本身已经将文件作为流公开(即,您可以获得OS API来读取/写入/搜索文件)。因此,文件流通常只包装OS文件句柄,并提供委托给那些OS API的方法。有时它们出于性能原因提供额外的缓冲 - 即,给予FileStream.Write的数据不会立即传递给OS“写入块到文件”API,而是缓存在缓冲区(通常是数组)中。当足够的写入发生缓冲区已满时,将调用OS API。

操作系统本身如何在其文件上实现这些流原语操作是高度特定于操作系统的。