用GZipStream对stream解压时,要注意的几点

 private const int SIZE = 4096;


public Stream EnCompress(Stream stream)
        {
            MemoryStream msOut 
= new MemoryStream();
            
try
            {
                GZipStream gzip 
= new GZipStream(msOut, CompressionMode.Compress);
                
byte[] buffer = new byte[SIZE];
                
int bytesRead;
                
while ((bytesRead = stream.Read(buffer, 0, SIZE)) > 0)
                {
                    gzip.Write(buffer, 
0, bytesRead);
                }
                
// 这个地方一定要Close了,gzip才会执行最后的压缩过程,不是很知道原因
                
// 是不是一定要close,Flush不知道可不可以
                gzip.Close();
            }
            
catch (Exception ex)
            {
                
throw new Exception("Compress failed!", ex);
            }
            
// 因为上面的close会把相关流都close掉,这里要返回一个新流
            return new MemoryStream(msOut.ToArray());
        }

public Stream DeCompress(Stream stream)
        {
            MemoryStream msOut 
= new MemoryStream();
            
try
            {
                GZipStream gzip 
= new GZipStream(stream, CompressionMode.Decompress);
                
byte[] buffer = new byte[SIZE];
                
int bytesRead;
                
while ((bytesRead = gzip.Read(buffer, 0, SIZE)) > 0)
                {
                    msOut.Write(buffer, 
0, bytesRead);
                }
                
// 这里为了安全起见,也把zip流关闭,再返回新流
                gzip.Close();
            }
            
catch (Exception ex)
            {
                
throw new Exception("DeCompress failed!", ex);
            }

            
// 如果这里返回原流的话,一定要把流seek到开始点
            return new MemoryStream(msOut.ToArray());
        }

注意点也就两个,一个返回的时候最好关闭zip流,返回一个新流.

二是如果返回 zip流的话,一定要seek到开始点

posted on 2009-04-24 09:43  蜡笔旺旺  阅读(429)  评论(0)    收藏  举报