2010-12-16 111 views
16

我有一個類基本上包裝流讀取/寫入,但該流預計由該類的消費者管理。爲了便於使用,我使用StreamReader和StreamWriter類對流進行I/O操作。通常情況下,我會將讀寫器封裝在using塊中,但我想避免關閉讀寫器,因爲這樣做也會關閉底層流,並且必須保持打開狀態。是否可以不關閉StreamReader/StreamWriter以保持底層流的打開?

是在內存/資源管理等方面的安全,不能關上一個StreamReader/StreamWriter的,如果我希望底層流被調用者進行管理?當流在其他地方顯式關閉時,讀者和作者是否會被垃圾收集?

public class Wrapper 
{ 
    private Stream _underlyingStream; 
    public Wrapper(Stream underlyingStream) 
    { 
     _underlyingStream = underlyingStream; 
    } 

    public string GetValue() 
    { 
     _underlyingStream.Seek(0, SeekOrigin.Begin); 
     var reader = new StreamReader(_underlyingStream); 
     return reader.ReadToEnd(); // we're done, but the stream is not ours to close 
    } 
} 
+2

這個問題可能會有所幫助:http://stackoverflow.com /問題/ 1862261 /可任您保持-A-的StreamReader - 從配置用最底層的流 – 2010-12-16 22:09:44

+1

不相關的問題,但因爲包裝不「擁有」流,你可能想也節省了原始'_underlyingStream.Position'並在返回給調用者之前將其恢復到ReadToEnd()之後的那個位置。 (雖然,您的使用可能會使呼叫者期望此位置受到此類呼叫的影響 - 並且如果它很重要,可以自行保存位置。) – 2016-03-22 22:49:16

回答

5

如果沒有人關閉了流,那麼最終的終結將被調用這應該叫處置和關閉它們在GC。但這在資源方面非常糟糕,因爲它留下了分配給GC的任何可能的昂貴資源。它可能變得更糟的時間越長你的對象的生命,尤其是如果它生存的集合晉升爲第1代或甚至2

這肯定將是很好,如果你可以提出一些你的調用者分離這一點。也許你可以從流中緩存某些內容,以便在向調用者提供內容的同時關閉它。

編輯您的編輯後:現在,我看到你的來電者通過你的流操作,我的答案必須是不同的!很明顯,你的調用者應該管理流的生命週期。起初我的印象是你的班級創建了一個流,並希望調用者管理它。

0

它確定地不好。 read this from msdn

密切調用Dispose方法傳遞一個真正的價值。 刷新流不會刷新其底層編碼器,除非您顯式調用Close。

嘗試封裝所有IO在一類。

+0

我不太贊同。爲什麼不沖淡底層編碼器是一件壞事?你有什麼鏈接方便嗎? – 2010-12-16 22:19:46

+1

沖洗是一回事,但令人煩惱的是包裝的處置也始終處理流。您通常仍然想從更高級別訪問它。 – Nyerguds 2016-03-15 11:51:03

相關問題