什么是编程世界中的流?为什么我们需要它?
如果可能,请在类比的帮助下进行解释。
流表示一系列对象(通常是字节,但不一定如此),可以按顺序访问。流上的典型操作:
一个特定的流可能支持读取(在这种情况下它是“输入流”)、写入(“输出流”)或两者兼而有之。并非所有流都是可搜索的。
推回相当罕见,但您始终可以通过将真实输入流包装在另一个包含内部缓冲区的输入流中来将其添加到流中。读取来自缓冲区,如果您向后推,则数据将放置在缓冲区中。如果缓冲区中没有任何内容,则推回流从实际流中读取。这是“流适配器”的一个简单示例:它位于输入流的“末端”,它本身就是一个输入流,它做了一些原始流没有做的额外事情。
Stream 是一个有用的抽象,因为它可以描述文件(实际上是数组,因此查找很简单),还可以描述终端输入/输出(除非缓冲,否则不可查找)、套接字、串行端口等。所以你可以编写代码“我想要一些数据,我不在乎它来自哪里或如何到达这里”,或者“我会产生一些数据,这完全取决于我的调用者会发生什么”。前者采用输入流参数,后者采用输出流参数。
我能想到的最好的类比是,溪流是一条传送带,向你走来或远离你(或有时两者兼而有之)。你从输入流中取出东西,你把东西放在输出流上。有些传送带你可以想象成从墙上的一个洞里出来——它们是不可搜索的,读或写是一次性的。一些传送带布置在您面前,您可以在流中选择您想要读/写的位置 - 这就是寻找。
不过,正如 IRBMe 所说,最好根据它提供的操作(从实现到实现不同,但有很多共同点)而不是通过物理类比来考虑流。流是“你可以读或写的东西”。当您开始连接上游适配器时,您可以将它们想象成一个盒子,其中有一个输入和输出,您连接到其他流,然后该盒子对数据执行一些转换(压缩它,或更改 UNIX 换行到 DOS 的,或其他的)。管道是对隐喻的另一个彻底测试:您可以在其中创建一对流,以便您写入其中的任何内容都可以从另一个中读出。想想虫洞:-)