前言

我们在项目中,有可能会遇到存入到数据库或者传输的数据量比较大,这个时候,就可以考虑在存入数据库或者发送传输之前,将数据压缩下,当从数据库中取出时,再解压还原数据。

正文

废话不多说,我封装了一个工具类用于压缩和解压数据,代码如下:

 using System;
using System.IO;
using System.IO.Compression;
using System.Text; namespace Test
{
public class GZipUtils
{
/// <summary>
/// 压缩指定字符串
/// </summary>
/// <param name="str">待压缩字符串</param>
/// <returns>返回压缩后的字节数组</returns>
public static byte[] Compress(string str)
{
if (string.IsNullOrEmpty(str)) return null; byte[] bytes = Encoding.UTF8.GetBytes(str);
return Compress(bytes);
} /// <summary>
/// 压缩指定字节数组
/// </summary>
/// <param name="bytes">待压缩字节数组</param>
/// <returns>返回压缩后的字节数组</returns>
public static byte[] Compress(byte[] bytes)
{
if (bytes == null || bytes.Length <= ) return bytes; using (var compressedStream = new MemoryStream())
{
using (var compressionStream = new GZipStream(compressedStream, CompressionMode.Compress))
{
compressionStream.Write(bytes, , bytes.Length);
}
return compressedStream.ToArray();
}
} /// <summary>
/// 压缩指定字符串到指定文件中
/// </summary>
/// <param name="compressData">待压缩字符串</param>
/// <param name="zipFilePath">压缩后的文件路径</param>
public static void CompressToFile(string compressData, string zipFilePath)
{
if (!string.IsNullOrEmpty(compressData))
{
byte[] bytes = Encoding.UTF8.GetBytes(compressData);
using (var originalStream = new MemoryStream(bytes))
{
using (FileStream compressedStream = File.Create(zipFilePath))
{
using (GZipStream compressionStream = new GZipStream(compressedStream, CompressionMode.Compress))
{
originalStream.CopyTo(compressionStream);
}
}
}
}
} /// <summary>
/// 从指定字节数组解压出字符串
/// </summary>
/// <param name="bytes">待解压的字节数组</param>
/// <returns>返回解压后的字符串</returns>
public static string DecompressToString(byte[] bytes)
{
var result = Decompress(bytes);
if (result == null || result.Length <= ) return string.Empty; return Encoding.UTF8.GetString(result);
} /// <summary>
/// 从指定字节数组解压出字节数组
/// </summary>
/// <param name="bytes">待解压的字节数组</param>
/// <returns>返回解压后的字节数组</returns>
public static byte[] Decompress(byte[] bytes)
{
if (bytes == null || bytes.Length <= ) return bytes; using (var originalStream = new MemoryStream(bytes))
{
using (var decompressedStream = new MemoryStream())
{
using (var decompressionStream = new GZipStream(originalStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedStream);
}
return decompressedStream.ToArray();
}
}
} /// <summary>
/// 从指定文件中解压出字符串
/// </summary>
/// <param name="zipFilePath">待解压的文件路径</param>
/// <returns>返回解压后的字符串</returns>
public static string DecompressFromFile(string zipFilePath)
{
if (File.Exists(zipFilePath))
{
using (FileStream originalStream = File.Open(zipFilePath, FileMode.Open))
{
using (MemoryStream decompressedStream = new MemoryStream())
{
using (GZipStream decompressionStream = new GZipStream(originalStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedStream);
}
byte[] bytes = decompressedStream.ToArray();
return Encoding.UTF8.GetString(bytes);
}
}
}
return string.Empty;
}
}
}

参考文档

  1. C# 关于GZipStream压缩与解压缩数据丢失问题

  2. GZipStream 类 (System.IO.Compression)

C#使用GZipStream实现压缩和解压缩的更多相关文章

  1. .net 利用 GZipStream 压缩和解压缩

    1.GZipStream 类 此类在 .NET Framework 2.0 版中是新增的. 提供用于压缩和解压缩流的方法和属性 2.压缩byte[] /// <summary> /// 压 ...

  2. 关于webservice大数据量传输时的压缩和解压缩

    当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...

  3. C#- 压缩和解压缩的研究 .

    用了第二种方法,感觉很不错,其他都没用过了.摘录下来,做一个备忘. 最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip ...

  4. .net中压缩和解压缩的处理

    最近在网上查了一下在.net中进行压缩和解压缩的方法,方法有很多,我找到了以下几种: 1.利用.net自带的压缩和解压缩方法GZip 参考代码如下: //======================= ...

  5. C#压缩和解压缩字节(GZip)

    标题:C#压缩和解压缩字节(GZip的使用) 作用:此类在 .NET Framework 2.0 版中是新增的.提供用于压缩和解压缩流的方法和属性.定义:表示 GZip 数据格式,它使用无损压缩和解压 ...

  6. Linux下的压缩和解压缩命令——gzip/gunzip

    gzip命令 gzip命令用来压缩文件.gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处".gz"扩展名. gzip是在Linux系统中经常使用的一个对文件进行压 ...

  7. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

  8. [Java 基础] 使用java.util.zip包压缩和解压缩文件

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  9. 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期

    [源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...

  10. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

随机推荐

  1. arm-linux-gcc4.4.3编译busybox-1.25.0

    系统环境: 1.操作系统:Ubuntu16.04 2.交叉编译工具链:arm-linux-gcc4.4.3 3.busybox源码包:busybox-1.25.0 一.修改Makefile配置 首先解 ...

  2. Java命名规范(简略)

    1.包 全部小写,由域名定义前缀. 例如:teach.golddrem.javagroup 2.类 开头字母大写,后边每个单词的首字母都大写.如果有缩写,缩写部分全部大写. 例如:Informatio ...

  3. dataguard 下主备 online redo 与 standby redo log resize 重建

    环境说明: 本实验环境是一个节点的rac + 单节点 asm dg     database 与 grid 版本是 11.2.0.4 .提别提醒 如果是多节点集群,操作时需要特别注意 thread . ...

  4. SimpliciTI协议地址分配

    1.多个ED节点和AP正确连接后,AP都会给ED分配一个相应的地址.当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除.当该ED恢复正常,重新申请加入网络时,AP会检测该 ...

  5. Docker入门(二):安装/卸载

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  6. python3+selenium使用浏览器IE的时候,无法打开IE浏览器,老是报错: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones

    python3+selenium使用浏览器IE的时候,老是报错: Unexpected error launching Internet Explorer. Protected Mode settin ...

  7. .Net锦囊-C#,.Net发送邮件三种方法…

    最近公司由于一个R&I项目的需要,用户要求在购买产品或出货等一些环节,需要发送邮件提醒或者说每周一让系统自动采集数据发送一封E-mail,因此我也就找来相关资料,写了一个Demo分享给大家,大 ...

  8. 35.Docker安装Mysql挂载Host Volume

    连个文件系统有块区域Area,我们要做的是把两个Area做文件映射 jesse腾讯云上有个linux的环境,版本比较老了 简书的地址: https://www.jianshu.com/p/b3bf64 ...

  9. Django 的 之 视图

    Django的View(视图) 一个视图函数(类),简称视图, 是个简单的python函数(类),它接受wed请求并且返回web 响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  10. Gym - 101611D Decoding of Varints(边界值处理)

    Decoding of Varints Statements Varint is a type used to serializing integers using one or more bytes ...