什么是一个流程的世界?我们为什么需要吗?

请解释有所帮助的一个比喻,如果可能的话。

有帮助吗?

解决方案

一流表示一系列对象(字节通常,但不一定如此),可访问的顺序。典型的操作流:

  • 读一个字节。下次你看,你就会得到下一个字节等等。
  • 读几个字节从流入的一个阵列
  • 寻求(移当前位置流,以便下次你看,你得到的字节的新职位)
  • 写一个字节
  • 写几个字组成的流
  • 跳字节的流(这是喜欢阅读但你忽略的数据。或如果你愿意就像寻求,但只能去转发。)
  • 推回字节入一个输入流(这是"撤销"for read-你把一些字节的回流,以便下一次你读的那是什么你会看到的。它偶尔会有用的分析程序,为的是:
  • peek(看字节没有阅读他们,使他们仍然存在的流以后阅读)

一个特别流可能支持阅读的(在这种情况下,它是一个"输入流"),写作("输出流")或两者。不是所有流是可搜索.

推回是相当罕见,但你总是可以将它添加到一个流通过包装的现实的输入流在另一个输入流拥有一个内部缓冲区。读来自缓冲,如果推回来,然后数据放置在缓冲区。如果没有在缓冲区,然后推回流读的真正流。这是一个简单的例子中的一个"流转换器":它坐落在"结束"的输入流,它是一个输入流本身,这不是额外的,原来的流没有。

流是一个有用的抽象,因为它可以描述的文件(这是真的阵列,因此寻求是直截了当)而且终端输入/输出(这是不可搜索,除非buffered)、插座、串口,等等。所以你可以写代码,其中说"我想要一些数据,我不在乎它从何而来,或者它是如何来到这里",或"我会产生一些数据,这完全取决于我叫什么会发生"。前者需要输入流参数,后者需要一个流输出参数。

最好的比喻,我可以想到的是,一个流是传送带来对你或导致从你(或有时候两个)。你把东西输入流,你把东西输出流。一些传送带你可以认为出来的一个墙洞他们不可搜索、阅读或写作是一个一次性的交易。一些输送机在你面前,你可以沿着选择的行踪,在流你想读写-那是寻求。

作为IRBMe说,虽然,最好想想一个流方面的行动提供的(其中有所不同,从实施以执行,但有很多共同点)而不是由一个物理的比喻。流"的东西,你可以读或写"。当你开始连接上适配器流,可以想想他们作为一个盒子输送带,并输送出去,你会连接到其他河流和随后的框执行一些转变的数据(压缩或改变UNIX换行DOS的人,或任何).管道的另一个彻底的测试的比喻:这就是你创造一个对流,如什么你写到一个可以读出。想虫洞:-)

其他提示

一个流已经是一个比喻,一个比喻,所以真的没必要等途径另一个。你可以认为它基本上作为一个管用的水流,在它其中的水是实际数据和管道的流。我想这是一种2-方法管如果流是双向的。它基本上是一个共同的抽象,是放在事情,那里是一个流动或序列的数据在一个或两个方向。

在语言,例如C#VB.Net、C++、Java等, 流的比喻是用于许多的事情。有文件流,其中你打开文件,并可以从中读取流或写信给它不断;有的是网络流在那里阅读和写入流的读写基础建立的网络连接。流写入通常称为输出流,作为在 例,并同样地,流,这对于阅读,只是称为输入流,作为在 例。

一个流可以进行转换或编码的数据(一个 SslStream 中。净,例如,将吃了SSL协商的数据和隐藏;一TelnetStream可能隐藏Telnet谈判,但提供进入数据;一个 ZipOutputStream 在Java允许你写的文件a zip,而不必担心内部的拉链文件的格式。

另一个常见的事情,你可能找到文本流能让你写的字符串而不是字节或某种语言提供的二流,让你写的原始种类型。一个常见的事,你会发现在的文本流是一字符编码,这你应该知道的。

一些流也支持随机访问,作为在 例。一个网络流,另一方面,由于显而易见的原因,不会。

UNIX操作系统还支持流模型的程序的输入和输出,作为描述 在这里,.

除了上面提到的内容之外,还有一种不同类型的流 - 如函数式编程语言(如Scheme或Haskell)中所定义的 - 可能是无限的数据结构,它是由某个函数按需生成的。

另一个比喻:你不能游戏流,这就是为什么你可以从流中获取下一个比特,字节,字符串或对象,同时删除已读取的数据。单程票......或者基本上只是队列而不存储持久性。

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

单词“stream”之所以被选中,是因为它代表(在现实生活中)与我们在使用它时想传达的内容非常相似。

开始考虑对水流的类比。您可以获得连续的数据流,就像水在河流中不断流动一样。您不一定知道数据的来源,通常您不需要;无论是从文件,套接字还是任何其他来源,它都不应该(不应该)真正重要。这非常类似于接收水流,因此您无需知道它来自何处;无论是从湖泊,喷泉还是其他任何来源,它都不(不应该)真正重要。 来源

到目前为止给出的答案非常好。我只是提供另一个来强调流不是字节序列或特定于编程语言,因为这个概念是通用的(虽然它的实现可能是唯一的)。我经常在SQL,C或Java方面看到大量的解释,这些解释在文件流处理内存位置和低级别操作时都很有意义。但是他们经常讨论如何创建文件流并使用给定语言对潜在文件进行操作,而不是讨论流的概念。

隐喻

如上所述, stream 是一个隐喻,是一个更复杂的东西的抽象。为了让你的想象力发挥作用,我提供了一些其他的比喻:

  1. 你想用水填充空池。实现这一目标的一种方法是将软管连接到套管上,将软管的末端放在水池中并打开水。
  2. 软管是流

    1. 同样地,如果你想给汽车补充气体,你可以去加油泵,将喷嘴插入油箱,然后挤压锁定杆打开阀门。
    2. 软管,喷嘴和相关的机制让气体流入你的水箱

      1. 如果你需要上班,你可以开始使用高速公路从家里开车到办公室。
      2. 高速公路是溪流

        1. 如果你想与某人交谈,你会用耳朵听,嘴巴说话。
        2. 你的耳朵和眼睛是溪流

          希望你在这些例子中注意到流隐喻只存在允许某些东西穿过它(或者在高速公路的情况下在它上面)而且它们本身并不构成它们正在转移的东西。一个重要的区别。我们不把我们的耳朵称为一系列单词。如果没有水流过软管,软管仍然是软管,但是我们必须将它连接到套管才能正常工作。汽车不是唯一可以穿越高速公路的“种类”汽车。

          因此,只要已连接 文件,就可以存在没有数据通过它的流。

          删除抽象

          接下来,我们需要回答几个问题。我将使用文件来描述流,所以...什么是文件?我们如何读取文件?我将尝试回答这个问题,同时保持一定程度的抽象以避免不必要的复杂性,并且由于其简单性和可访问性,将使用相对于Linux操作系统的文件概念。

          什么是文件?

          文件是抽象:)

          或者,正如我可以解释的那样,文件是描述文件的一部分数据结构和一部分数据,它是实际内容。

          数据结构部分(在UNIX / linux系统中称为inode)标识有关内容的重要信息,但不包括内容本身(或该文件的名称)。它保留的信息之一是内容开始的内存地址。因此,使用文件名(或Linux中的硬链接),文件描述符(操作系统关心的数字文件名)和内存中的起始位置,我们可以调用文件。

          (关键点是'文件'是由操作系统定义的,因为它是最终必须处理它的操作系统。是的,文件要复杂得多。)

          到目前为止一切顺利。但是我们如何得到文件的内容,给你的男友写一封情书,以便我们打印出来?

          读取文件

          如果我们从结果开始并向后移动,当我们在计算机上打开文件时,其全部内容会在我们的屏幕上溅到我们面前阅读。但是怎么样?非常

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top