GZipStream或DeflateStream类?
MSDN文档告诉我以下内容:
GZipStream类使用gzip数据格式,其中包括循环冗余校验值来检测数据损坏。 gzip数据格式使用与DeflateStream类相同的压缩algorithm。
看来GZipStream增加了一些额外的数据输出(相对于DeflateStream)。 我想知道,什么样的情况下使用GZipStream而不是DeflateStream?
Deflate只是压缩algorithm。 GZip实际上是一种格式。
如果使用GZipStream
压缩文件(并将其保存为扩展名.gz
),结果实际上可以由诸如WinZip或gzip
工具之类的归档文件打开。 如果使用DeflateStream
压缩,这些工具将无法识别文件。
如果压缩文件被devise为通过这些工具打开,那么使用GZipStream
而不是DeflateStream
是非常重要的。
如果您通过不可靠的介质(即互联网连接)传输大量数据而不使用TCP / IP等错误纠正协议,我也认为这是非常重要的。 例如,您可能正在通过串行端口,原始套接字或UDP进行传输。 在这种情况下,您肯定会希望embeddedGZip格式的CRC信息以确保数据正确。
GZipStream与DeflateStream相同,但增加了一些CRC来确保数据没有错误。
那么,我的第一个答案是完全错误的。 我查了Mono的源代码,发现GZipStream类实际上是将其读/写(以及几乎任何其他的)调用redirect到适当的内部DeflateStream对象的方法调用:
public override int Read (byte[] dest, int dest_offset, int count) { return deflateStream.Read(dest, dest_offset, count); } public override void Write (byte[] src, int src_offset, int count) { deflateStream.Write (src, src_offset, count); }
唯一的区别是,它总是创build一个gzip标志设置为true的DeflateStream对象。 这当然不是你问题的答案,但也许会有所帮助。
按照Aaronaught的Dito
注意另外一个重要的区别
http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12 :
我测量的DeflateStream比GZip快41%。
我没有测量速度,但我测量的文件大小为APPX。 一样。
虽然GZipStream似乎在使用DeflateStream进行解压缩,但这两种algorithm看起来并不是可以互换的。 下面的testing代码会给你一个例外:
MemoryStream wtt=new MemoryStream(); using (var gs=new GZipStream(wtt,CompressionMode.Compress,true)) { using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true)) { sw.WriteLine("Hello"); } } wtt.Position = 0; using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true)) { using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true)) { var txt = sr.ReadLine(); } }