什么是stream?

编程世界中的stream是什么? 我们为什么需要它? 如果可能,请在类比的帮助下解释。

stream表示一系列对象(通常是字节,但不一定是这样),它们可以按顺序访问。 stream上的典型操作:

  • 读一个字节。 下一次你读,你会得到下一个字节,等等。
  • 从stream中读取几个字节到一个数组中
  • 寻找(移动你在stream中的当前位置,以便下一次你读取你从新位置得到的字节)
  • 写一个字节
  • 将数组中的几个字节写入stream中
  • 从stream中跳过字节(这就像读取,但是你忽略了数据,或者如果你喜欢它就像查找,但只能往前走)。
  • 将字节压回到inputstream中(这就像读取“撤消”一样),你把几个字节放回到stream中,这样下一次你读到的就是你将看到的东西。
  • 偷看(查看字节而不读取它们,以便它们在stream中仍然存在以待阅读)

一个特定的stream可能支持阅读(在这种情况下,它是一个“inputstream”),写(“输出stream”)或两者。 并非所有的stream都是可search的。

推回是相当less见的,但是您可以通过将实际inputstream包装到另一个包含内部缓冲区的inputstream中,将其添加到stream中。 读取来自缓冲区,如果您推回来,则数据被放置在缓冲区中。 如果缓冲区中没有任何内容,则推回stream将从实际stream中读取。 这是一个“stream适配器”的简单例子:它位于inputstream的“结尾”,它是一个inputstream本身,它做了一些额外的东西,原来的stream没有。

stream是一个有用的抽象,因为它可以描述文件(这是真正的数组,因此寻求是直接的),而且terminalinput/输出(这是不可search,除非缓冲),套接字,串行端口等。所以你可以写代码要么是“我想要一些数据,我不在乎它来自哪里,或者它是如何到达这里的”,或者“我会产生一些数据,完全取决于我的调用者发生了什么事情”。 前者接受inputstream参数,后者接受输出stream参数。

我能想到的最好的比喻是,溪stream是一条传送带向你走来,或者远离你(或者两者)。 你从inputstream中取出东西,把东西放在输出stream上。 一些传送带可以被认为是从墙上钻出来的 – 它们是不可追求的,阅读或写作是一次性交易。 有些传送带摆放在你的面前,你可以随意select你要读/写的stream的下落 – 这是寻求。

正如IRBMe所说,最好从stream程的angular度思考一个stream程(从实现到实现,但有许多共同之处),而不是物理上的类比。 stream是“你可以读或写的东西”。 当你开始连接stream适配器时,你可以把它们想象成一个盒子,里面有一个传送带,一个传送带,连接到其他stream,然后这个盒子对数据进行一些转换(压缩或改变UNIX换行符到DOS的,或者其他)。 pipe道是隐喻的另一个彻底的考验:那就是你创build一对stream的地方,这样任何你写入其中的东西都可以被读出来。 认为虫洞:-)

stream已经是一个比喻,是一个比喻,所以真的不需要另辟蹊径。 你可以把它想象成一个水stream动的pipe道,水是实际的数据,而pipe道是水stream。 如果stream是双向的,我想这是双向的pipe道。 它基本上是一个常见的抽象,它被放置在一个或两个方向上有数据stream或数据序列的地方。

在诸如C#,VB.Net,C ++,Java等语言中,stream隐喻被用于许多事情。 有文件stream,您可以在其中打开一个文件,并可以从stream中读取或写入; 有一些networkingstream可以读取和写入数据stream,从而读取和写入基础的已build立的networking连接。 如本例中,用于写入的stream典型地称为输出stream,并且类似地,仅用于读取的stream被称为inputstream。

一个stream可以执行数据的转换或编码(例如,在.Net中的SslStream会占用SSL协商数据并将其隐藏起来; TelnetStream可能会隐藏Telnet协商,但可以访问数据; A Java中的ZipOutputStream允许您写入zip文件中的文件,而不必担心zip文件格式的内部结构。

另一个常见的东西是文本stream,它允许你写string而不是字节,或者一些语言提供二进制stream,允许你写基本types。 在文本stream中你会发现一个常见的东西是一个字符编码,你应该知道。

一些stream也支持随机访问,如本例所示。 另一方面,一个networkingstream,由于显而易见的原因,不会。

  • MSDN给出了.Net中stream的一个很好的概述。
  • Sun也有一般的OutputStream类和InputStream类的概述。
  • 在C ++中,这里是istream (inputstream), ostream (输出stream)和iostream (双向stream)文档。

像操作系统一样,UNIX也支持带有程序input和输出的stream模型,如下所述。

除了上面提到的东西之外,还有一种不同types的stream – 如在Scheme或Haskell这样的函数式编程语言中定义的 – 可能是由一些按需函数产生的无限数据结构。

另一个比喻:你不能游泳stream,这就是为什么你可以从stream中取下一个位,字节,string或对象,而已经读取的数据被删除。 一张单程票…或基本上只是一个队列没有存储持久性。

那我们需要排队吗? 你决定。

“stream”这个词已经被选中,因为它代表了(在现实生活中)与我们在使用它时要expression的意思非常相似的意思。

开始考虑与水stream类比。 你会收到一个连续的数据stream,就像水在河中不断stream动一样。 你不一定知道数据来自哪里,大多数情况下你不需要; 无论是从文件,套接字或其他来源,它不(不应该)真正重要。 这与接收水stream非常相似,因此您不需要知道它来自哪里。 无论是湖泊,喷泉还是其他来源,它都不是(不应该)真的很重要。 资源