• 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)

  • 相关阅读:
    node-red 使用 创建第一个流程
    node-red 安装
    docker postgres 导出导入数据
    6大设计模式(转)
    常见的算法
    @Autowired与@Resource的区别
    Elasticsearch
    redis搭建主从复用-读写分离
    转载redis持久化的几种方式
    后台启动mysql
  • 原文地址:https://www.cnblogs.com/CCHUncle/p/9550181.html
Copyright © 2020-2023  润新知