壓縮和解壓都需要用到三個流實例,分別是文件讀取流、文件寫入流、壓縮流。
讀取流和寫入流有多種形式,壓縮流就一種GzipStream。
不同的是對於壓縮,是需要用文件寫入流作為創建壓縮流實例的參數,
壓縮時是通過文件讀取流讀取文件,壓縮流寫入文件,這樣就完成了壓縮。
解壓,是需要用文件讀取流為參數創建壓縮流實例,
通過壓縮讀取流讀取文件,再通過文件寫入流寫入文件,這樣就完成了解壓。
這里解析一個枚舉CompressionMode,它有兩個值分別是Compress、DeCompress。
表示壓縮和解壓,在創建壓縮流實例的時候會用到。
代碼解析
壓縮
//1.創建讀取文本文件的流 using (FileStream fsRead = File.OpenRead("1.txt")) { //2.創建寫文件流 using (FileStream fsWrite = File.OpenWrite(@"C:\Users\john\Desktop\yasuo.rar")) { //3.創建壓縮流 using (GZipStream zipStream = new GZipStream(fsWrite, CompressionMode.Compress)) { byte[] byts = new byte[1024]; int len = 0; //4.通過讀取文件流讀取數據 while ((len = fsRead.Read(byts, 0, byts.Length)) > 0) { //通過壓縮流寫入數據 zipStream.Write(byts, 0, len); } } } }
解壓
//1.創建讀取流 using (FileStream fsRead = File.OpenRead(@"C:\Users\john\Desktop\yasuo.rar")) { //2.創建壓縮流,把讀取流作為參數, using (GZipStream zip = new GZipStream(fsRead, CompressionMode.Decompress)) { //創建寫入流 using (FileStream fsWrite=File.OpenWrite(@"C:\Users\john\Desktop\1.txt")) { byte[] byts = new byte[1024]; int len = 0;//用於表示真是接受到是字節個數 //通過壓縮流讀取數據 while ((len=zip.Read(byts,0,byts.Length))>0) { //MessageBox.Show(Encoding.UTF8.GetString(byts.Take(len).ToArray())); //通過文件流寫入文件 fsWrite.Write(byts, 0, len);//讀取的長度為len,這樣不會造成數據的錯誤 } } } }