我一直在研究一些利用流的东西,但我发现自己不清楚一些流概念(您也可以查看我在 About redirected stdout in System.Diagnostics.Process 发布的另一个问题)。
1.你如何表明你已经完成了一个流的写入,写入了诸如EOF之类的东西?
2.按照上一个问题,如果我已经向流写入了 EOF(或类似的内容)但没有关闭流,那么我想向同一个流写入其他内容,我可以开始写入吗不需要更多设置?
3.如果一个过程尝试读取一个没有人写入任何内容的流(例如 stdin ),则读取过程将被阻塞,最后一些数据到达,该过程将只读取直到写入完成,这是通过返回 0 字节读取计数而不是被阻止来指示的,现在如果该过程向同一流发出另一个读取,它仍然会得到 0 计数并立即返回,而我预计它会被阻止,因为现在没有人正在向流写入数据。那么,当流被打开但尚未有人写入时以及当有人完成写入 session 时,流是否会保持不同的状态?
如果有任何特定于平台的东西,我正在使用 Windows .net 框架。
非常感谢!
最佳答案
这取决于具体的流。例如,读取MemoryStream不会像你所描述的那样阻塞。这是因为 MemoryStream 具有明确的大小,当您从流中读取时,指针会在流中前进,直到到达末尾,此时 Read 将返回 0。如果 MemoryStream 中没有数据,则第一个 Read 会返回 0。会立即返回 0。
您所描述的内容符合 NetworkStream ,在这种情况下,当“服务器”端关闭底层 Socket 时,从流中读取数据将被阻塞,直到数据可用为止。由 NetworkStream 包装的读取将返回 0。
因此实际细节取决于流,但在高层,它们都被视为相同的,即。您可以从流中读取数据,直到 Read 返回 0。
关于c# - 关于流的一些事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933995/