2011-11-17 54 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一个更大的压缩窗口。

多线程打包不应该是一个问题,只要你把所有的多线程操作都限制在类的内部。如果您希望多个线程能够并发写入流,则必须创建某种同步机制来防止在输入缓冲区中交织数据。同样,如果将同步限制在类内部,那么应该没有问题。同样的东西适用于多线程解包和阅读。