2009-10-27 56 views
8

由於discussed before,當BinaryReader或BinaryWriter被關閉時,其基礎Stream也會關閉(aargh)。考慮這種情況:例程R通過一個MemoryStream,比如M;我想寫一些東西到M,然後將它傳遞給另一個例程進行更多處理(不一定寫入)。爲了方便起見,我想將M包裝在BinaryWriter中來完成我的寫作。寫完之後,我完成了BinaryWriter,但沒有完成M如何在.NET中「分流」Stream?

void R(MemoryStream M) 
{ 
    using (B = new BinaryWriter(M)) 
    { 
     // write some stuff using B 
    } 

    S(M); // now pass M to another routine for further processing 
} 

但是,我不能沒有關閉M處置BinaryStream的。

問:是否有辦法執行以下任一操作?

  • 提取一個MemoryStream底層字節[],
  • 克隆的Stream
  • 重新打開一個流,它已經關閉
+0

我不知道C#,但在Java中,您只需放棄而不關閉BinaryWriter。不使用{...}構造強制關閉?那麼不要使用這個構造! – 2009-10-27 21:47:16

+0

P.S.但是在放棄BinaryWriter之前,你確實需要確保你刷新BinaryWriter。 – 2009-10-27 21:48:05

回答

2

感謝幾位建議ToArray的人,我被引導到了正確的答案,即'M.GetBuffer'。 ToArray的是不是太糟糕,但它

  • 進行復印
  • 僅獲取緩衝區的部分

的GetBuffer只是抓住底層字節[],這是什麼我參考後。

+0

在我的答案中指出;) – 2009-10-27 21:25:51

0

A之後稍微幼稚的方法是使用

byte buf[] = MemoryStream.ToArray(); 

將流內容複製到字節數組。你可以用

MemoryStream ms = new MemoryStream(buf); 
+0

值得強調的是:這種方法適用於閉路電視以及現場直播。 – 2009-10-27 21:11:40

2

你可以把它放回流:()

  • 呼叫M.ToArray獲得流作爲字節數組。
  • 子類的BinaryWriter並重寫Dispose方法,防止該兒童流
+0

+1專門用於Dispose覆蓋。 – 2009-10-27 21:23:20

+0

難道你不能避免調用close/Dispose嗎? – 2009-10-27 21:51:52

-1

Accoring閉合到this M.Clone();應該管用。但我可能是錯的...

+0

-1張貼到一個網站,不允許查看它的內容是免費的,這是非常沒用 – 2010-05-07 12:00:52

7

你應該使用

byte[] buffer = ms.GetBuffer(); 

更好地得到潛在的byte []緩衝區,然後使用Array.Copy()方法複製字節的數據。 你可以隨意創建一個新的流。

+0

我不明白你爲什麼說最好使用GetBuffer,然後使用Array.Copy複製。如果我想要一個副本,我只是使用ToArray。 – 2009-10-29 23:28:14

+0

來自MSDN doc 該方法從數組中省略MemoryStream中未使用的字節。要獲取整個緩衝區,請使用GetBuffer方法。 http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx – 2009-10-30 06:51:42

+0

上述「此方法」指的是MemoryStream.ToArray() – 2009-10-30 06:53:21

5

可以使用的東西像MiscUtilMiscUtil.IO.NonClosingStreamWrapper,它包裝一個Stream和簡單地忽略Close/Dispose請求。只是爲了這個目的。

void R(MemoryStream M) 
{ 
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M))) 
    { 
     // write some stuff using B 
    } 

    S(M); // now pass M to another routine for further processing 
}  
1

只需將它添加在這裏,一個很簡單的解決辦法是到Dispose()方法的作家。

void R(MemoryStream M) 
{ 
    B = new BinaryWriter(M); 

    // write some stuff using B   
    B.Flush(); 
    S(M); // now pass M to another routine for further processing 
} 

現在你只需要擔心保持在範圍B,它將爲R時()。

這可能不是最好的解決方案,但值得注意的是讀者和作者不需要自己處理。

+0

讓我們希望'BinaryWriter'不會緩衝任何東西,然後... – 2009-10-27 21:44:17

+0

但是確保在完成之後調用B.flush(),以防它沒有將所有內容都推送到M.(這是Java中會需要什麼,不知道C#) – 2009-10-27 21:50:24

+0

好吧,阿德里安和馬克,我忘了沖洗()。 – 2009-10-27 21:52:05