C# 关于GZipStream压缩与解压缩数据丢失问题

来源:互联网 发布:nginx 配置全局变量 编辑:程序博客网 时间:2024/05/16 14:24

网上有很多关于GZipStream压缩与解压缩的例子,开始测试没问题,但我不习惯直接用别人的代码,少不了左改右改。改来改去问题来了,数据解压缩还原不出来了。看人家的例子和我的也没差哪去啊,为什么我的就还原不出来了。翻来覆去找原因,发现有的压缩时候就丢失了,有的是还原时候出错了。遇到压缩比较少的内容时候,还读不出压缩内容。难道GZipStream对压缩内容大小有限制 0.0  绝对不可能的,继续找原因!!!

然后发现用FileStream和GZipStream搭配能稍微好点,但是也出问题。最后上网继续找资料。http://bbs.csdn.net/topics/330249113,终于发现是我忽略了GZipStream关闭释放的位置的原因。

这是原来的代码

            string rawStr = "的花洒觉得会撒娇的还是骄傲的好久撒活动就撒谎的叫撒"; /// 要压缩的内容
            MemoryStream ms = new MemoryStream();                                 /// 不使用FileStream而是用MemoryStream承载            GZipStream gzip = new GZipStream(ms, CompressionMode.Compress);       /// 初始化<span style="font-family: Arial, Helvetica, sans-serif;">GZipStream</span>            byte[] rawData = Encoding.UTF8.GetBytes(rawStr);                      /// 写入要压缩的数据            gzip.Write(rawData, 0, rawData.Length);            byte[] result = ms.ToArray();                                         ///<span style="font-family: Arial, Helvetica, sans-serif;"> 重点就在这里,其实这一句应该放到 gzip.Dispose();的后面</span>            gzip.Dispose();                                                       /// 关闭释放            ms.Dispose();                                                         /// 关闭释放            return result;                                                        /// 返回压缩内容

其实,当我们执行这句时候

gzip.Write(rawData, 0, rawData.Length);

gzip只是把内容编码,放在自己的缓存中,并没有向MemoryStream中写入,因为还没有达到gzip的缓存极限。所以这时候如果我们去MemoryStream中去取编码结果,不是少了一部分就是结果为0字节。

而执行

gzip.Dispose();  
这句,就会使gzip把缓存中余下的内容全部写入MemoryStream中。所以一定要在gzip流释放之后去承载对象中读取数据或判断数据大小。这样取得的结果才是真实的。



0 0