Stream 什么是小溪?

Stream 什么是小溪?,stream,terminology,Stream,Terminology,编程世界中的流是什么?我们为什么需要它 如果可能的话,请用一个比喻来解释。一个流已经是一个比喻,一个比喻,所以真的没有必要再提供另一个。你可以把它想象成一个有水流的管道,水实际上是数据,管道就是流。如果水流是双向的,我想这是一种双向管道。它基本上是一种常见的抽象,放在一个或两个方向上有数据流或数据序列的事物上 在C++语言、VB.NET、C++、java等语言中,流隐喻被用于很多事物。有文件流,您可以在其中打开一个文件,并可以从该文件流中连续读取或写入该文件;存在网络流,其中对流的读取和写入从底

编程世界中的流是什么?我们为什么需要它


如果可能的话,请用一个比喻来解释。

一个流已经是一个比喻,一个比喻,所以真的没有必要再提供另一个。你可以把它想象成一个有水流的管道,水实际上是数据,管道就是流。如果水流是双向的,我想这是一种双向管道。它基本上是一种常见的抽象,放在一个或两个方向上有数据流或数据序列的事物上

在C++语言、VB.NET、C++、java等语言中,流隐喻被用于很多事物。有文件流,您可以在其中打开一个文件,并可以从该文件流中连续读取或写入该文件;存在网络流,其中对流的读取和写入从底层已建立的网络连接进行读取和写入。例如,仅用于写入的流通常称为输出流,类似地,仅用于读取的流称为输入流

流可以执行数据的转换或编码(例如,.Net中的一个将吃掉SSL协商数据并对您隐藏;TelnetStream可能会对您隐藏Telnet协商,但提供对数据的访问;Java中的一个允许您写入zip存档中的文件,而不必担心zip文件格式的内部

您可能会发现另一个常见的东西是允许您编写字符串而不是字节的文本流,或者一些语言提供允许您编写基本类型的二进制流。在文本流中,您会发现一个常见的东西是字符编码,您应该知道这一点

一些流也支持随机访问,例如,另一方面,由于明显的原因,网络流不支持

  • 对.Net中的流进行了很好的概述
  • Sun还概述了他们的一般课程和课程
  • 在C++中,这里是(输入流)、(输出流)和(双向流)文档。

类UNIX操作系统还支持具有程序输入和输出的流模型,如前所述。

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

  • 读取一个字节。下次读取时,将获得下一个字节,依此类推
  • 将流中的几个字节读入数组
  • seek(移动流中的当前位置,以便下次读取时从新位置获取字节)
  • 写入一个字节
  • 将数组中的几个字节写入流
  • 从流中跳过字节(这类似于读取,但您忽略了数据。或者,如果您喜欢,它类似于查找,但只能前进。)
  • 将字节向后推到输入流中(这类似于读取时的“撤消”-您将一些字节向后推到流中,以便下次读取时,您将看到这些字节。这对解析器偶尔有用,如下所示:
  • peek(在不读取字节的情况下查看字节,以便它们仍然存在于稍后要读取的流中)
特定流可能支持读取(在这种情况下,它是“输入流”)、写入(“输出流”)或两者兼而有之。并非所有流都是可查找的

回推非常罕见,但您始终可以通过将真实输入流包装到另一个包含内部缓冲区的输入流中来将其添加到流中。读取来自缓冲区,如果回推,则数据放置在缓冲区中。如果缓冲区中没有任何内容,则回推流从真实流读取。这是一个简单的示例“流适配器”的le:它位于输入流的“末端”,它本身就是一个输入流,它做一些原始流没有做的额外事情

流是一个有用的抽象,因为它可以描述文件(实际上是数组,因此seek很简单),还可以描述终端输入/输出(除非缓冲),套接字,串行端口等。所以您可以编写代码,上面写着“我想要一些数据,我不在乎它从哪里来,也不在乎它是怎么来的”,或者“我将生成一些数据,这完全取决于我的调用者对它的处理情况”。前者接受一个输入流参数,后者接受一个输出流参数

我能想到的最好的类比是,一条小溪是一条传送带,向你走来或从你身边离开(有时两者兼而有之)。你从输入流中取出东西,然后把东西放在输出流中。有些传送带你可以认为是从墙上的一个洞里出来的——它们是看不见的,读或写都是一次性的。有些传送带摆在你面前,你可以在流中选择你想读/写的地方——这就是seeking


不过,正如IRBMe所说,最好从流提供的操作(不同的实现不同,但有很多共同点)来考虑流,而不是通过物理类比“。当您开始连接上游适配器时,您可以将其视为一个带有传入和传出传送带的盒子,连接到其他流,然后盒子对数据执行一些转换(压缩数据,或将UNIX换行器更改为DOS换行器,或其他任何操作)管道是对这个比喻的另一个彻底的检验:在这里,你可以创建一对流,这样你在其中写入的任何东西都可以从另一条流中读出

除了上面提到的东西之外,还有一种不同类型的流——如Scheme或Haskell等函数式编程语言所定义的——一种可能是无限的数据结构,由一些函数按需生成。

另一个类比:你不能在流中游泳,这就是为什么你只需要下一位、字节、stri从流中删除或删除对象,而