主要是因為GZipStream的構造函數中第一個需要傳入一個Stream,第二個是指定操作方式:壓縮還是解壓縮。
當時的疑問點主要有:
1.我傳入的Stream是包含未壓縮數據的Stream嗎?
2.我解壓時是從一個壓縮流中讀取數據后再用GZipStream解壓嗎?
出現以上兩點疑問,完全是我將GZipStream的用法理解反了。
其實GZipStream里面存的是已經壓縮過的數據流,傳入的Stream是作為基礎Stream傳入,如果要壓縮,那你就可以傳一個空的Stream進去,如果要解壓,就將包含壓縮數據的Stream傳進去。
而GZipStream的讀和寫分別對應的是解壓和壓縮兩個操作,知道了這些,使用起來就簡單了。
寫入的數據會被壓縮后寫入到傳入的Stream中,讀取的數據也是解壓后的數據,可以直接寫入到一個新的流中。
byte[] cbytes = null;
//壓縮
using (MemoryStream cms = new MemoryStream())
{
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms,System.IO.Compression.CompressionMode.Compress))
{
//將數據寫入基礎流,同時會被壓縮
byte[] bytes = Encoding.UTF8.GetBytes("解壓縮測試");
gzip.Write(bytes, 0, bytes.Length);
}
cbytes = cms.ToArray();
}
//解壓
using (MemoryStream dms = new MemoryStream())
{
using (MemoryStream cms = new MemoryStream(cbytes))
{
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms, System.IO.Compression.CompressionMode.Decompress))
{
byte[] bytes = new byte[1024];
int len = 0;
//讀取壓縮流,同時會被解壓
while ((len = gzip.Read(bytes, 0, bytes.Length)) > 0)
{
dms.Write(bytes, 0, len);
}
}
}
Console.WriteLine(Encoding.UTF8.GetString(dms.ToArray()));
}
同時 在壓縮時傳入的流可以是非空流,你可以在寫入其他數據后再寫入壓縮數據,不會影響最后的結果。
如果你在解壓時遇到“幻數頭不正確”的提示,是因為你要解壓的數據不是用GZip壓縮的。
新聞熱點
疑難解答