壓縮、解壓縮流GZipStream


  如果要在壓縮過程中檢查錯誤或要與其他操作系統所用程序共享壓縮數據,則要是用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();
        }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM