C#使用GZipStream實現壓縮和解壓縮


前言

我們在項目中,有可能會遇到存入到數據庫或者傳輸的數據量比較大,這個時候,就可以考慮在存入數據庫或者發送傳輸之前,將數據壓縮下,當從數據庫中取出時,再解壓還原數據。

正文

廢話不多說,我封裝了一個工具類用於壓縮和解壓數據,代碼如下:

  1 using System;
  2 using System.IO;
  3 using System.IO.Compression;
  4 using System.Text;
  5 
  6 namespace Test
  7 {
  8     public class GZipUtils
  9     {
 10         /// <summary>
 11         /// 壓縮指定字符串
 12         /// </summary>
 13         /// <param name="str">待壓縮字符串</param>
 14         /// <returns>返回壓縮后的字節數組</returns>
 15         public static byte[] Compress(string str)
 16         {
 17             if (string.IsNullOrEmpty(str)) return null;
 18 
 19             byte[] bytes = Encoding.UTF8.GetBytes(str);
 20             return Compress(bytes);
 21         }
 22 
 23         /// <summary>
 24         /// 壓縮指定字節數組
 25         /// </summary>
 26         /// <param name="bytes">待壓縮字節數組</param>
 27         /// <returns>返回壓縮后的字節數組</returns>
 28         public static byte[] Compress(byte[] bytes)
 29         {
 30             if (bytes == null || bytes.Length <= 0) return bytes;
 31 
 32             using (var compressedStream = new MemoryStream())
 33             {
 34                 using (var compressionStream = new GZipStream(compressedStream, CompressionMode.Compress))
 35                 {
 36                     compressionStream.Write(bytes, 0, bytes.Length);
 37                 }
 38                 return compressedStream.ToArray();
 39             }
 40         }
 41 
 42         /// <summary>
 43         /// 壓縮指定字符串到指定文件中
 44         /// </summary>
 45         /// <param name="compressData">待壓縮字符串</param>
 46         /// <param name="zipFilePath">壓縮后的文件路徑</param>
 47         public static void CompressToFile(string compressData, string zipFilePath)
 48         {
 49             if (!string.IsNullOrEmpty(compressData))
 50             {
 51                 byte[] bytes = Encoding.UTF8.GetBytes(compressData);
 52                 using (var originalStream = new MemoryStream(bytes))
 53                 {
 54                     using (FileStream compressedStream = File.Create(zipFilePath))
 55                     {
 56                         using (GZipStream compressionStream = new GZipStream(compressedStream, CompressionMode.Compress))
 57                         {
 58                             originalStream.CopyTo(compressionStream);
 59                         }
 60                     }
 61                 }
 62             }
 63         }
 64 
 65         /// <summary>
 66         /// 從指定字節數組解壓出字符串
 67         /// </summary>
 68         /// <param name="bytes">待解壓的字節數組</param>
 69         /// <returns>返回解壓后的字符串</returns>
 70         public static string DecompressToString(byte[] bytes)
 71         {
 72             var result = Decompress(bytes);
 73             if (result == null || result.Length <= 0) return string.Empty;
 74 
 75             return Encoding.UTF8.GetString(result);
 76         }
 77 
 78         /// <summary>
 79         /// 從指定字節數組解壓出字節數組
 80         /// </summary>
 81         /// <param name="bytes">待解壓的字節數組</param>
 82         /// <returns>返回解壓后的字節數組</returns>
 83         public static byte[] Decompress(byte[] bytes)
 84         {
 85             if (bytes == null || bytes.Length <= 0) return bytes;
 86 
 87             using (var originalStream = new MemoryStream(bytes))
 88             {
 89                 using (var decompressedStream = new MemoryStream())
 90                 {
 91                     using (var decompressionStream = new GZipStream(originalStream, CompressionMode.Decompress))
 92                     {
 93                         decompressionStream.CopyTo(decompressedStream);
 94                     }
 95                     return decompressedStream.ToArray();
 96                 }
 97             }
 98         }
 99 
100         /// <summary>
101         /// 從指定文件中解壓出字符串
102         /// </summary>
103         /// <param name="zipFilePath">待解壓的文件路徑</param>
104         /// <returns>返回解壓后的字符串</returns>
105         public static string DecompressFromFile(string zipFilePath)
106         {
107             if (File.Exists(zipFilePath))
108             {
109                 using (FileStream originalStream = File.Open(zipFilePath, FileMode.Open))
110                 {
111                     using (MemoryStream decompressedStream = new MemoryStream())
112                     {
113                         using (GZipStream decompressionStream = new GZipStream(originalStream, CompressionMode.Decompress))
114                         {
115                             decompressionStream.CopyTo(decompressedStream);
116                         }
117                         byte[] bytes = decompressedStream.ToArray();
118                         return Encoding.UTF8.GetString(bytes);
119                     }
120                 }
121             }
122             return string.Empty;
123         }
124     }
125 }
View Code

參考文檔

  1. C# 關於GZipStream壓縮與解壓縮數據丟失問題

  2. GZipStream 類 (System.IO.Compression)


免責聲明!

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



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