`

压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏

阅读更多

压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏

  下面为大家介绍一.NET下辅助公共类GZipHelper,该工具类主要作用是对文本、字符、文件等进行压缩与解压。该类主要使用命名空间:System.IO.Compression下的GZipStream类来实现。  此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。这种格式包括一个检测数据损坏的循环冗余校验值。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。这种格式可以通过不涉及专利使用权的方式轻松实现。gzip 的格式可以从 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式规范 4.3)GZIP file format specification 4.3(GZIP 文件格式规范 4.3)”中获得。此类不能用于压缩大于 4 GB 的文件。

  一、属性

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

使用原生的方法进行压缩解压文件实例代码:

 

[csharp] view plaincopy
 
  1. /// <summary>  
  2.  /// 压缩文件  
  3.  /// </summary>  
  4.  /// <param name="fileName">文件名(全路径)</param>  
  5.  /// <param name="data">需要压缩的字符串</param>  
  6.  public void CompressFile(string fileName, string data)  
  7.  {         
  8.      FileStream fstream = new FileStream(fileName, FileMode.Create, FileAccess.Write);  
  9.      GZipStream gstream = new GZipStream(fstream, CompressionMode.Compress);  
  10.      StreamWriter swriter = new StreamWriter(gstream);  
  11.      swriter.Write(data);  
  12.      swriter.Close();  
  13.      gstream.Close();  
  14.      fstream.Close();  
  15.  }  
  16.  /// <summary>  
  17.  /// 解压缩  
  18.  /// </summary>  
  19.  /// <param name="fileName">文件名(全路径)</param>  
  20.  /// <returns></returns>  
  21.  public string DecompressFile(string fileName)  
  22.  {  
  23.      string cstring="";  
  24.      FileStream fstream = new FileStream(fileName, FileMode.Open, FileAccess.Read);  
  25.      GZipStream gstream = new GZipStream(fstream, CompressionMode.Decompress);  
  26.      StreamReader reader = new StreamReader(gstream);  
  27.      cstring=reader.ReadToEnd();  
  28.      reader.Close();  
  29.      gstream.Close();  
  30.      fstream.Close();  
  31.      return cstring;  
  32.  }  

 

GZipHelper公共类就是以GZipStream类为基础做的对常用解压缩进行的封装。GZipHelper类图如下所示:

 GZipHelper公共类完整源码:

 

[csharp] view plaincopy
 
  1. using System;  
  2. using System.IO;  
  3. using System.IO.Compression;  
  4. using System.Text;  
  5.    
  6. namespace RDIFramework.Utilities  
  7. {  
  8.     /// <summary>  
  9.     /// 压缩文本、字节或者文件的压缩辅助类  
  10.     /// </summary>  
  11.     public class GZipHelper  
  12.     {  
  13.         /// <summary>  
  14.         /// 压缩字符串  
  15.         /// </summary>  
  16.         /// <param name="text"></param>  
  17.         /// <returns></returns>  
  18.         public static string Compress(string text)  
  19.         {  
  20.             // convert text to bytes  
  21.             byte[] buffer = Encoding.UTF8.GetBytes(text);  
  22.             // get a stream  
  23.             MemoryStream ms = new MemoryStream();  
  24.             // get ready to zip up our stream  
  25.             using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))  
  26.             {  
  27.                 // compress the data into our buffer  
  28.                 zip.Write(buffer, 0, buffer.Length);  
  29.             }  
  30.             // reset our position in compressed stream to the start  
  31.             ms.Position = 0;  
  32.             // get the compressed data  
  33.             byte[] compressed = ms.ToArray();  
  34.             ms.Read(compressed, 0, compressed.Length);  
  35.             // prepare final data with header that indicates length  
  36.             byte[] gzBuffer = new byte[compressed.Length + 4];  
  37.             //copy compressed data 4 bytes from start of final header  
  38.             System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);  
  39.             // copy header to first 4 bytes  
  40.             System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);  
  41.             // convert back to string and return  
  42.             return Convert.ToBase64String(gzBuffer);  
  43.         }  
  44.    
  45.         /// <summary>  
  46.         /// 解压字符串  
  47.         /// </summary>  
  48.         /// <param name="compressedText"></param>  
  49.         /// <returns></returns>  
  50.         public static string Uncompress(string compressedText)  
  51.         {  
  52.             // get string as bytes  
  53.             byte[] gzBuffer = Convert.FromBase64String(compressedText);  
  54.             // prepare stream to do uncompression  
  55.             MemoryStream ms = new MemoryStream();  
  56.             // get the length of compressed data  
  57.             int msgLength = BitConverter.ToInt32(gzBuffer, 0);  
  58.             // uncompress everything besides the header  
  59.             ms.Write(gzBuffer, 4, gzBuffer.Length - 4);  
  60.             // prepare final buffer for just uncompressed data  
  61.             byte[] buffer = new byte[msgLength];  
  62.             // reset our position in stream since we're starting over  
  63.             ms.Position = 0;  
  64.             // unzip the data through stream  
  65.             GZipStream zip = new GZipStream(ms, CompressionMode.Decompress);  
  66.             // do the unzip  
  67.             zip.Read(buffer, 0, buffer.Length);  
  68.             // convert back to string and return  
  69.             return Encoding.UTF8.GetString(buffer);  
  70.         }  
  71.    
  72.         public static T GZip<T>(Stream stream, CompressionMode mode) where T : Stream  
  73.         {  
  74.             byte[] writeData = new byte[4096];  
  75.             T ms = default(T);  
  76.             using (Stream sg = new GZipStream(stream, mode))  
  77.             {  
  78.                 while (true)  
  79.                 {  
  80.                     Array.Clear(writeData, 0, writeData.Length);  
  81.                     int size = sg.Read(writeData, 0, writeData.Length);  
  82.                     if (size > 0)  
  83.                     {  
  84.                         ms.Write(writeData, 0, size);  
  85.                     }  
  86.                     else  
  87.                     {  
  88.                         break;  
  89.                     }  
  90.                 }  
  91.                 return ms;  
  92.             }  
  93.         }  
  94.    
  95.         /// <summary>  
  96.         /// 压缩字节  
  97.         /// </summary>  
  98.         /// <param name="bytData"></param>  
  99.         /// <returns></returns>  
  100.         public static byte[] Compress(byte[] bytData)  
  101.         {  
  102.             using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Compress))  
  103.             {  
  104.                 return stream.ToArray();  
  105.             }  
  106.         }  
  107.    
  108.         /// <summary>  
  109.         /// 解压字节  
  110.         /// </summary>  
  111.         /// <param name="bytData"></param>  
  112.         /// <returns></returns>  
  113.         public static byte[] Decompress(byte[] bytData)  
  114.         {  
  115.             using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Decompress))  
  116.             {  
  117.                 return stream.ToArray();  
  118.             }  
  119.         }  
  120.    
  121.         /// <summary>  
  122.         /// 压缩文件  
  123.         /// </summary>  
  124.         /// <param name="sourceFile">源文件</param>  
  125.         /// <param name="destinationFile">目标文件</param>  
  126.         public static void CompressFile(string sourceFile, string destinationFile)  
  127.         {  
  128.             if (File.Exists(sourceFile) == false//判断文件是否存在  
  129.                 throw new FileNotFoundException();  
  130.             if (File.Exists(destinationFile) == false//判断目标文件文件是否存在  
  131.                 FileHelper.FileDel(destinationFile);  
  132.             //创建文件流和字节数组  
  133.             byte[] buffer = null;  
  134.             FileStream sourceStream = null;  
  135.             FileStream destinationStream = null;  
  136.             GZipStream compressedStream = null;  
  137.             try  
  138.             {  
  139.                 sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);  
  140.                 buffer = new byte[sourceStream.Length];  
  141.                 //把文件流存放到字节数组中  
  142.                 int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);  
  143.                 if (checkCounter != buffer.Length)  
  144.                 {  
  145.                     throw new ApplicationException();  
  146.                 }  
  147.                 destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write);  
  148.                 //创建GzipStream实例,写入压缩的文件流  
  149.                 compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true);  
  150.                 compressedStream.Write(buffer, 0, buffer.Length);  
  151.             }  
  152.             finally  
  153.             {  
  154.                 // Make sure we allways close all streams  
  155.                 if (sourceStream != null)  
  156.                 { sourceStream.Close(); }  
  157.                 if (compressedStream != null)  
  158.                 { compressedStream.Close(); }  
  159.                 if (destinationStream != null)  
  160.                 { destinationStream.Close(); }  
  161.             }  
  162.         }  
  163.    
  164.         /// <summary>  
  165.         /// 解压文件  
  166.         /// </summary>  
  167.         /// <param name="sourceFile">源文件</param>  
  168.         /// <param name="destinationFile">目标文件</param>  
  169.         public static void DecompressFile(string sourceFile, string destinationFile)  
  170.         {  
  171.             if (!File.Exists(sourceFile))  
  172.             {  
  173.                 throw new FileNotFoundException();  
  174.             }  
  175.             FileStream stream = null;  
  176.             FileStream stream2 = null;  
  177.             GZipStream stream3 = null;  
  178.             byte[] buffer = null;  
  179.             try  
  180.             {  
  181.                 stream = new FileStream(sourceFile, FileMode.Open);  
  182.                 stream3 = new GZipStream(stream, CompressionMode.Decompress, true);  
  183.                 buffer = new byte[4];  
  184.                 int num = ((int)stream.Length) - 4;  
  185.                 stream.Position = num;  
  186.                 stream.Read(buffer, 0, 4);  
  187.                 stream.Position = 0L;  
  188.                 byte[] buffer2 = new byte[BitConverter.ToInt32(buffer, 0) + 100];  
  189.                 int offset = 0;  
  190.                 int count = 0;  
  191.                 while (true)  
  192.                 {  
  193.                     int num5 = stream3.Read(buffer2, offset, 100);  
  194.                     if (num5 == 0)  
  195.                     {  
  196.                         break;  
  197.                     }  
  198.                     offset += num5;  
  199.                     count += num5;  
  200.                 }  
  201.                 stream2 = new FileStream(destinationFile, FileMode.Create);  
  202.                 stream2.Write(buffer2, 0, count);  
  203.                 stream2.Flush();  
  204.             }  
  205.             finally  
  206.             {  
  207.                 if (stream != null)  
  208.                 {  
  209.                     stream.Close();  
  210.                 }  
  211.                 if (stream3 != null)  
  212.                 {  
  213.                     stream3.Close();  
  214.                 }  
  215.                 if (stream2 != null)  
  216.                 {  
  217.                     stream2.Close();  
  218.                 }  
  219.             }  
  220.         }  
  221.     }  
  222. }  

   

参考资料

MSDN GZipStream 类介绍

作者: EricHu 
出处:http://blog.rdiframework.net/
Email:406590790@qq.com 
QQ交流:406590790 
关于作者:高级工程师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于 RDIFramework.NET 框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。 
如有问题或建议,请多多赐教! 
本文版权归作者和CNBLOGS博客共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过邮箱或QQ 联系我,非常感谢。

0
0
分享到:
评论

相关推荐

    Huffman编码算法压缩文本文件

    5. **解压缩文件**:解压缩时,读取压缩文件的字节流,根据编码表还原出原始字符,从而恢复原文本。这同样涉及到二进制序列到字符的转换过程。 6. **效率分析**:Huffman编码的优点在于可以有效地减少数据存储需求...

    文本文件压缩解压

    【文本文件压缩解压】是IT领域中一种常见的数据处理技术,主要目的是减小文件的存储空间,提高传输效率。该技术涉及到多个知识点,包括: 1. **堆排序**:在构建霍夫曼树的过程中,堆排序是一种常用的方法。霍夫曼...

    易语言读写文件到字节集

    字节集是易语言中用来存储二进制数据的数据类型,它在处理文件、网络传输或者内存操作时非常有用。 1. **字节集的基本概念** - 字节集是易语言的一种数据结构,它可以容纳任意长度的二进制数据,如图片、音频、...

    文本字节集互转工具

    综上所述,"文本字节集互转工具"是一个实用的辅助工具,它简化了开发者和普通用户在处理字节集与文本之间的转换工作,对于理解和操作二进制数据具有重要意义。在实际工作中,了解并掌握这类工具的使用,能提高工作...

    行业分类-设备装置-2字节字符数据的压缩方法.zip

    在IT行业中,数据压缩是一种常见的技术,用于减小文件大小,提高存储效率和网络传输速度。针对"行业分类-设备装置-2字节字符数据的压缩方法"这一主题,我们可以深入探讨以下几个关键知识点: 1. **字符编码与2字节...

    易语言字节集文件的十六进制和文本的读取操作

    本文将深入探讨易语言字节集文件的十六进制和文本的读取操作,帮助开发者理解如何有效地处理这类文件。 首先,字节集文件是二进制数据的容器,它可能包含任何非文本格式的信息,如图片、音频、程序代码等。在易语言...

    标准字节流拷贝纯文本文件工具类

    这个名为"标准字节流拷贝纯文本文件工具类"的代码库可能包含了一些辅助方法,旨在简化使用这些类来复制纯文本文件的过程。在不同的JDK版本中,字节流的拷贝方法可能存在一些差异。 在JDK1.6及其之前的版本中,字节...

    C语言实现哈夫曼编码压缩和解压各种文件

    (3) 依次读取原始文件的每个字节,查找其对应的哈弗曼编码,将这些位写入到压缩文件中(注意:要凑够8位二进制才写入到文件中)。 (4) 将原始文件中各字节及出现的次数也写入到压缩文件中。 2、解压 (1) 从...

    易语言文本和字节集相互转换

    又如在读写文件时,文件内容可能需要先转化为字节集,然后写入文件,读取后再转换回文本。 通过以上介绍,我们了解了易语言中处理文本和字节集的基本方法,掌握了如何在两者之间进行转换。掌握这些技巧对于编写...

    java字节码文件查看工具,查看class文件

    Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...

    易语言文本到字节集

    1. 数据存储:在保存文件或数据库记录时,将文本转换为字节集,可以减少存储空间,提高存储效率。 2. 网络通信:在网络传输过程中,数据通常以字节集的形式发送,因为字节集不受特定字符集限制,适应性更强。 3. ...

    文本文件压缩【huffman编码实现】

    文本文件压缩是信息处理中的一个重要领域,特别是在大数据和存储有限的场景下,高效的数据压缩技术显得尤为关键。Huffman编码是一种基于频率的无损数据压缩方法,由David A. Huffman在1952年提出,它是数据结构课程...

    小童鞋文本-字节转换工具

    在IT领域,字节转换工具是一种非常实用的软件,它能够帮助用户将数据从一种格式转化为另一种,尤其是在处理文本和二进制数据时显得尤为重要。"小童鞋文本-字节转换工具"很可能是一个专为初学者设计的简单易用的程序...

    《走遍美国》英文文本教材 - RAR 压缩文件, 解包大小为 223,155 字节

    《走遍美国》是一套著名的英语学习教材,其英文文本版本被封装在RAR压缩文件中。RAR是一种流行的压缩格式,由Eugene Roshal开发,用于数据压缩和归档,它提供了比ZIP等其他常见格式更高的压缩比,同时支持多卷压缩、...

    行业分类-设备装置-按网络协议对字节流进行压缩的方法.zip

    文件“按网络协议对字节流进行压缩的方法.pdf”很可能是详细阐述这一主题的文档,包括具体的技术实现、优化策略以及案例分析。阅读这份文档将有助于深入理解如何在不同网络协议下有效地压缩字节流,从而提高网络通信...

    易语言源码文本文件字节集寻找替换.7z

    《易语言源码文本文件字节集寻找替换》 易语言是一种专为中国用户设计的、简单易学的编程语言,它的出现降低了编程的门槛,让更多的人可以参与到程序开发中来。在易语言中,处理文本文件和字节集是常见的操作,尤其...

    易语言字节集到文本

    易语言字节集到文本源码,字节集到文本,字节数据到文本_

    易语言源码易语言文本转换字节集源码.rar

    - 文件存储:在保存文件时,文本内容也会被转换成字节集写入磁盘。 - 加密解密:在数据安全领域,文本通常会被加密成字节集,然后发送或存储,接收方再将其解密回文本。 5. **易语言的实现** - 易语言提供了丰富...

    判断文本文件是否为UTF-8编码

    在实际应用中,这种功能常用于编程语言的文本处理库,例如Python的`chardet`库,Java的`CharsetDetector`,或者C++的`ICU`库等,它们都提供了自动检测文件编码的方法。 了解并掌握文本文件的编码识别,对于进行跨...

    文本文件字节集寻找替换.rar

    在IT领域,文本文件字节集寻找替换是一个常见的任务,特别是在软件开发、数据处理和文本分析中。这个任务涉及到对文本文件的二进制表示进行操作,以查找特定的字节序列并用新的字节序列替换。下面我们将深入探讨这个...

Global site tag (gtag.js) - Google Analytics