2011-11-17 52 views
0

C#中設計打包/轉換流代理的最佳方式是什麼?c sharp中的流設計

假設,我有一些輸入流,我希望做類似於boost::iostreams的事情。

因此,例如,我可以zlib包裝代理到流,所以,當我訪問ZlibWrappedStream(initialStream)的內容,我從initialStream接收數據,但使用zlib包裝?

怎麼可以這樣設計是考慮到不同的代理可應用於陸續並考慮多線程包裝的可能性?

回答

1

.NET流已經允許您正在討論的鏈接。例如,如果我想要將gzip數據存儲到一個文件中,我可以編寫以下內容:

using (var fs = File.OpenWrite(outputFilename)) 
{ 
    using (var gz = new GZipStream(fs, CompressionMode.Compress)) 
    { 
     // now, write to the GZip stream . . . 
     gz.Write(buffer, 0, buffer, length); 
    } 
} 

您可以使該鏈任意長。例如,我經常在GZipStream前面加上BufferedStream,給gzip一個更大的壓縮窗口。

多線程打包不應該是一個問題,只要你把所有的多線程操作都限制在類的內部。如果您希望多個線程能夠併發寫入流,則必須創建某種同步機制來防止在輸入緩衝區中交織數據。同樣,如果將同步限制在類內部,那麼應該沒有問題。同樣的東西適用於多線程解包和閱讀。