2010-05-29 18 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」。你寫信給一個流直到你關閉它,這阻止了它被進一步寫入。

流只讀取和寫入字節。就這樣。