2010-05-29 122 views
2

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

1.你如何表示你已经写完一个流,写了类似EOF的东西?

2.关注上一个问题,如果我已经写了一个EOF(或类似的东西)到一个流但没有关闭流,那么我想写一些其他的东西到同一个流,我可以直接启动写信给它,不再需要设置?

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

我正在使用Windows .net框架,如果有任何事情平台具体。

非常感谢!

回答

3

这取决于具体的流。例如,从MemoryStream读取不会因为您描述的而被阻止。这是因为MemoryStream具有明确的大小,并且在从流中读取指针时,指针将通过未到达末尾的流进展,此时Read将返回0.如果MemoryStream中没有数据,则首先读取将立即返回0.

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

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

+0

stdin stdout流的工作方式与NetWorkStream的工作方式相同吗? – sforester 2010-05-29 10:52:58

+0

@sforester,stdin/stdout是非随机访问流,比如NetworkStream,所以没有预测流数据何时结束,当流关闭时流读取将结束。 – 2010-05-29 12:52:53

1

流没有“EOF”。你写信给一个流直到你关闭它,这阻止了它被进一步写入。

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