如果要在壓縮過程中檢查錯誤或要與其他操作系統所用程序共享壓縮數據,則要是用GZipStream類。GZipStream類包含是用GZip數據格式進行壓縮和解壓縮文件的方法,該類不能用於解壓縮大於4GB的文件。
一、屬性
BaseStream 獲取對基礎流的引用。
CanRead 獲取一個值,該值指示流是否支持在解壓縮文件的過程中讀取文件。 (重寫 Stream..::.CanRead。)
CanSeek 獲取一個值,該值指示流是否支持查找。 (重寫 Stream..::.CanSeek。)
CanTimeout 獲取一個值,該值確定當前流是否可以超時。 (繼承自 Stream。)
CanWrite 獲取一個值,該值指示流是否支持寫入。 (重寫 Stream..::.CanWrite。)
Length 不支持,並且總是引發 NotSupportedException。 (重寫 Stream..::.Length。)
Position 不支持,並且總是引發 NotSupportedException。 (重寫 Stream..::.Position。)
ReadTimeout 獲取或設置一個值(以毫秒為單位),該值確定流在超時前嘗試讀取多長時間。 (繼承自 Stream。)
WriteTimeout 獲取或設置一個值(以毫秒為單位),該值確定流在超時前嘗試寫入多長時間。 (繼承自 Stream。)
二、方法
BeginRead 開始異步讀操作。 (重寫 Stream..::.BeginRead(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。)
BeginWrite 開始異步寫操作。 (重寫 Stream..::.BeginWrite(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。)
Close 關閉當前流並釋放與之關聯的所有資源(如套接字和文件句柄)。 (繼承自 Stream。)
CreateObjRef 創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (繼承自 MarshalByRefObject。)
Dispose 已重載。
EndRead 等待掛起的異步讀取完成。 (重寫 Stream..::.EndRead(IAsyncResult)。)
EndWrite 處理異步寫入的結束。 (重寫 Stream..::.EndWrite(IAsyncResult)。)
Flush 將當前 GZipStream 對象的內部緩沖區的內容刷新到基礎流。 (重寫 Stream..::.Flush()()()。)
GetHashCode 用作特定類型的哈希函數。 (繼承自 Object。)
GetLifetimeService 檢索控制此實例的生存期策略的當前生存期服務對象。 (繼承自 MarshalByRefObject。)
InitializeLifetimeService 獲取控制此實例的生存期策略的生存期服務對象。 (繼承自 MarshalByRefObject。)
MemberwiseClone 已重載。
Read 將若干解壓縮的字節讀入指定的字節數組。 (重寫 Stream..::.Read(array<Byte>[]()[], Int32, Int32)。)
ReadByte 從流中讀取一個字節,並將流內的位置向前推進一個字節,或者如果已到達流的末尾,則返回 -1。 (繼承自 Stream。)
Seek 此屬性不受支持,並且總是引發 NotSupportedException。 (重寫 Stream..::.Seek(Int64, SeekOrigin)。)
SetLength 此屬性不受支持,並且總是引發 NotSupportedException。 (重寫 Stream..::.SetLength(Int64)。)
Write 從指定的字節數組中將壓縮的字節寫入基礎流。 (重寫 Stream..::.Write(array<Byte>[]()[], Int32, Int32)。)
WriteByte 將一個字節寫入流內的當前位置,並將流內的位置向前推進一個字節。 (繼承自 Stream。)
練了下手,附上代碼:(注意釋放資源。)
static void Main(string[] args) { //string str = "你好asd阿叔打算"; //for (int i = 0; i < 20000; i++) //{ // str += "你好asd阿叔打算的"; //} //File.WriteAllText(@"E:\file.txt", str, Encoding.UTF8); //Console.WriteLine("添加完成"); //以上代碼輸出一個468K的txt文件 FileStream fs = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.ReadWrite); byte[] bytes = new byte[fs.Length]; fs.Read(bytes,0,(int)fs.Length); // 壓縮入這個文件流 FileStream fs1 = new FileStream(@"E:\file1.txt", FileMode.CreateNew, FileAccess.Write); GZipStream gs = new GZipStream(fs1, CompressionMode.Compress, true); //把數據寫入壓縮流 gs.Write(bytes, 0, bytes.Length); //寫入之后,會自動調用FileStream.Write()方法 這時候E盤會生成一個E:\file1.txt文件,里面是壓縮之后的內容 Console.WriteLine(fs.Length); //輸出 480024 Console.WriteLine(fs1.Length); //輸出 5142 //壓縮流寫入內存 MemoryStream target = new MemoryStream(); GZipStream gzs = new GZipStream(target, CompressionMode.Compress, true); gzs.Write(bytes, 0, bytes.Length); //相當於調用了MemoryStream的Write方法,已將壓縮的數據寫入內存 byte[] byteCompress = target.ToArray(); Console.WriteLine(target.Length); //輸出5142 //解壓縮后輸出 FileStream fs2 = new FileStream(@"E:\file1.txt",FileMode.Open,FileAccess.Read); byte[] byte1 = new byte[fs2.Length]; GZipStream gzs1 = new GZipStream(fs2, CompressionMode.Decompress, true); StreamReader streamR = new StreamReader(gzs1, Encoding.Default); string str = streamR.ReadToEnd(); Console.WriteLine(str); //輸出解壓之后的內容了 好長的 //解壓縮之后用Read()是在不知道長度該如何確定 FileStream fs3 = new FileStream(@"E:\file1.txt", FileMode.Open, FileAccess.Read); byte[] byte2 = new byte[fs2.Length]; GZipStream gzs2 = new GZipStream(fs2, CompressionMode.Decompress, true); gzs1.Read(byte2,0,byte2.Length); Console.WriteLine(Encoding.UTF8.GetString(byte2)); //輸出解壓之后的內容了 好長的 Console.ReadKey(); }