用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到开始点
浙公网安备 33010602011771号