使用 GZipStream 實現壓縮和解壓縮
概述
之前做項目,涉及到存入到數據庫或者 http 傳輸的數據量比較大,這個時候,就需要考慮在存入數據庫或者發送傳輸之前,將數據壓縮下,當從數據庫中取出時,再解壓還原數據。特地找了下發現有 GZipStream 可以實現這個功能。此類表示 gzip 數據格式,該格式使用行業標準算法進行無損文件壓縮和解壓縮。該格式包括用於檢測數據損壞的循環冗餘校驗值。gzip 數據格式使用與 DeflateStream 類相同的算法,但可以擴展爲使用其他壓縮格式。該格式很容易以專利未涵蓋的方式實施。從. NET Framework 4.5 開始,DeflateStream 類使用 zlib 庫進行壓縮。因此,與. NET Framework 的早期版本相比,它提供了更好的壓縮算法,並且在大多數情況下,提供了較小的壓縮文件。
GZipStream 使用的一般流程如下:
打開一個現有的文件
打開 / 創建輸出文件
創建 GZipStream 對象
逐字節讀源文件,並把它傳遞到 GZipStream
使用 GZipStream 寫入到輸出文件流
代碼實現
1、壓縮字符串
/// <summary>
/// 壓縮字串,回傳 Base64 結果
/// </summary>
/// <param ></param>
/// <returns></returns>
public static string ZipText(string text)
{
byte[] inputBytes = Encoding.UTF8.GetBytes(text);
return ZipText(inputBytes);
}
public static string ZipText(byte[] inputBytes)
{
using (MemoryStream outputStream = new MemoryStream())
{
using (GZipStream gs = new GZipStream(outputStream, CompressionMode.Compress))
{
gs.Write(inputBytes, 0, inputBytes.Length);
}
byte[] outputBytes = outputStream.ToArray();
string result = Convert.ToBase64String(outputBytes);
return result;
}
}
2、解壓縮字符串
/// <summary>
/// 解壓縮字串
/// </summary>
/// <param ></param>
/// <returns></returns>
public static string UnzipZippedText(string zippedText)
{
if (String.IsNullOrEmpty(zippedText))
{
return String.Empty;
}
string unzipedText = null;
try
{
byte[] buffer = Convert.FromBase64String(zippedText);
MemoryStream ms = new MemoryStream(buffer);
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress);
using (StreamReader streamReader = new StreamReader(zipStream))
{
unzipedText = streamReader.ReadToEnd();
}
}
catch (Exception ex)
{
unzipedText = String.Empty;
}
return unzipedText;
}
運行結果測試,源文件經過壓縮大小隻有 120 字節,而解壓後,源文件與解壓後 txt 的大小一致
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/zSjwjq-hM_ZFwbef75LsBQ