我需要一个zlib deflate压缩流。在我的实现中,我必须在整个会话中使用单个流。在此会话期间,小块数据将通过压缩流传递。每次传递一个块时,必须立即以压缩形式发送。
我的第一次尝试是使用DeflateStream但是当我发送第一个块时,它的压缩数据不会出现,直到我关闭流。
阅读zlib flush modes,看起来好像我需要一种特定的模式。
答案 0 :(得分:2)
DotNetZip项目有一个子模块Zlib,它包含自己的DeflateStream实现。
此实现具有另一个名为FlushMode的属性:
DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress);
deflate.FlushMode = FlushType.Sync;
deflate.Write (data, 0, data.Length);
//No call to deflate.Flush() needed, automatically flushed on every write.
答案 1 :(得分:0)
它确实只在关闭时冲洗。您每次都需要使用不同的DeflateStream实例,将 true 传递给overloaded constructor,告诉它不关闭底层流当你关闭DeflateStream时。
答案 2 :(得分:0)
要回答有关如何启用“同步刷新”行为的问题,您应该在zlib源代码中看到zpipe.c示例。
将第1行替换为下面显示的第2行
Deflate()
将返回
或者当输入缓冲区为空时同时附加到
压缩流一个空的文字块也称为
“同步刷新”,但最后是Z_FINISH
标志。
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
flush = feof(source) ? Z_FINISH : Z_SYNC_FLUSH;
ret = deflate(&strm, flush);