【问题标题】:Something about Stream关于 Stream
【发布时间】:2011-02-25 09:56:22
【问题描述】:

我一直在研究使用流的东西,但我发现自己不清楚一些流概念(您也可以查看我在About redirected stdout in System.Diagnostics.Process 发布的另一个问题)。

1.你如何表明你已经写完一个流,写一个像EOF这样的东西?

2.按照上一个问题,如果我已将 EOF(或类似的东西)写入流但没有关闭流,那么我想向同一流写入其他内容,我可以开始写吗无需更多设置?

3.如果一个程序试图读取一个没有人向其写入任何内容的流(如标准输入),读取程序将被阻塞,最后一些数据到达,程序将读取直到写入完成,这通过返回 0 个读取的字节数而不是被阻塞来表示,现在如果该过程向同一个流发出另一个读取,它仍然会得到一个 0 计数并立即返回,而我期望它会被阻塞,因为现在没有人在写入流。那么,当流打开但没有人写入它以及有人完成写入会话时,流是否保持不同的状态?

如果有任何特定于平台的东西,我正在使用 Windows .net 框架。

非常感谢!

【问题讨论】:

    标签: c# .net stream


    【解决方案1】:

    这取决于具体的流。例如,从MemoryStream 读取不会像您所描述的那样阻塞。这是因为 MemoryStream 具有明确的大小,并且当您从流中读取时,指针会在流中前进,直到您到达末尾,此时 Read 将返回 0。如果 MemoryStream 中没有数据,则第一次读取会立即返回 0。

    您所描述的内容符合NetworkStream,在这种情况下,从流中读取将被阻塞,直到数据可用,当“服务器”端关闭由 NetworkStream 包装的底层Socket 时,读取将返回 0 .

    所以实际细节取决于流,但在高层次上,它们都被视为相同,即。您可以从流中读取,直到 Read 返回 0。

    【讨论】:

    • stdin 标准输出流的工作方式是否与 NetWorkStream 大致相同?
    • @sforester,stdin/stdout 是像 NetworkStream 一样的非随机访问流,因此没有预先确定流数据何时结束,流读取将在流关闭时结束。
    【解决方案2】:

    流没有“EOF”。您写入流直到关闭它,这会阻止它被进一步写入。

    流只是读取和写入字节。就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 2017-03-05
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多