在C#
中设计打包/转换流代理的最佳方法是什么?
假设,我有一些输入流,我希望做一些类似于boost::iostreams
的事情。
因此,例如,我可以将zlib
打包代理到流,以便当我访问ZlibWrappedStream(initialStream)
的内容时,我从initialStream
接收数据,但使用zlib
进行打包?
。. NET流已经允许您正在谈论的链接。例如,如果我想将数据压缩并存储到一个文件中,我可以这样写:
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);
}
}
你可以使这个链任意长。例如,我经常将BufferedStream
放在GZipStream
前面,以便为gzip提供更大的压缩窗口。
只要将所有的多线程操作限制在类的内部,多线程打包应该不是问题。如果您希望多个线程能够并发地写入流,则必须创建某种同步机制来防止输入缓冲区中的数据交错。同样,如果您将同步限制在类内部,那么应该不会有问题。同样的事情也适用于多线程解包和读取。