转[韩小明]探索流(Stream)的概念

从一开始接触,就感觉流(Stream)是一个非常抽象的概念。在C语言中,有三个标准流:StdIn,StdOut,StdErr。那个时候的感觉,用我的L同事的话来说,流就是一个神秘的洞。

我一直在探究流的概念。到底什么是流,流有什么特点,Delphi中的TStream到底和真正的流的概念相差多少?可惜一直没有合理的答案发现。

前一段时间,开始对YAML 有了兴趣。在这里也顺便对YAML 进行简单的介绍。YAML 是一个可供人阅读的数据序列化格式。其类似于XML的作用。但是其存储格式采用语言结构存储。所以其同样是机器可读的格式(方便编程)。

其详细介绍,我想通过另外一篇专门介绍。所以这里之介绍和流相关的内容。更多内容可以访问: http://www.yaml.org/

在Yaml的设计目标中有这样的描述:

  • YAML enables stream-based processing.

这里面要注意的就是stream-based processing。我对此进行了继续的探索,发现流的概念最基本的是在流媒体中出现的。电视、音乐、视频等等都是以流的方式进行处理。而且有专门的处理这些数据流的芯片,叫DSP(Digital Signal Processor)。

在流媒体中,有一个非常重要的特点,那就是数据量极大!由于这点,导致不能缓存所有的数据。所以对流的定义,都围绕着这个特点提出:

  • 流数据读取的方向是单一的

  • 流数据不能往回读取

  • 流数据的缓存非常少

所谓“落花有意,流水无情”,流过的水,是不能回头的。也正是这一点,才成就了“流”这个特殊的概念。我认为当初这个概念的翻译非常到位。或者说中外在这方面都有共同的认识。

综合上面所说,可以总结认为,流的最大概念在于单向处理。

不过上面的概念,仅仅停留在最初的流的概念上。后来的各种语言发展过程中,将很多序列化的线型数据,都当成流来处理。下面是一般情况下Stream定义的方法:

  1. Seek

  2. Read

  3. Write

在各种类型的流中,最基本的就是FileStream。个人以为这个流被现在很多的人理解歪了。首先,FileStream应该出自于Unix中的 概念,因为Unix将所有设备都归为File,包括网络、显卡、文件、USB等等。但在Windows中并没有这样默认的概念。

我之所以说很多人将FileStream用错了,是因为,很多文件的存储格式是非Stream-Based的,多为结构化存储,因此在处理这些文件的时候,必然需要Seek来回操作。使用了流的处理类,但却并不是流的理念去操作的。

还有就是MemoryStream的概念,就更夸张了。它基本上是用来作为一个连续的二进制存储区域而已。除非我们可以将流的概念扩展开来,包含二进制数据存储格式。

好了,基本上对流的概念有了比较基础的了解了。不过这里,我想对咱们中国的计算机业倡议一下,我们需要把一些基础的概念做一些明确的概念,就免得好学者这么地去茫然理解了。

你可能感兴趣的:(Stream)