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

  

参考资料

MSDN GZipStream 类介绍

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

时间: 2024-10-11 22:16:34

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

压缩文本、字节或者文件的压缩辅助类

using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.IO; using Microsoft.Win32; using System.IO.Compression; using System.Runtime.Serialization.Formatters.Binary; namespace AIMSCommon { /// <summar

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

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

Java知多少(73)文件的压缩处理

Java.util.zip 包中提供了可对文件的压缩和解压缩进行处理的类,它们继承自字节流类OutputSteam 和 InputStream.其中 GZIPOutputStream 和 ZipOutputStream 可分别把数据压缩成 GZIP 和 Zip 格式,GZIPInpputStream 和 ZipInputStream 又可将压缩的数据进行还原. 将文件写入压缩文件的一般步骤如下: 生成和所要生成的压缩文件相关联的压缩类对象. 压缩文件通常不只包含一个文件,将每个要加入的文件称为一

PDF文件在线压缩变小的方法

  PDF文件在线压缩的方法有?PDF文件太大会导致上传文件上传不上,当PDF很小的时候就可以进行压缩变小,PDF文件是怎么压缩变小的呢?那么下面小编就简单的给大家介绍一下将PDF在线压缩的简单方法吧. 1.    首先需要进行在线压缩的方法很简单,准备好PDF文件,然后直接进入到在线压缩中: 2.    进入之后就可以进行压缩类型的设置,选择一下压缩质量,然后进行文件的添加: 3.    添加文件时可以是需要进行文件的直接拖拽或是点击选择文件进行上传: 4.    等文件上传好之后就可以进行压

pdf文件在线压缩的方法

pdf在线压缩的方法很简单,我们可以经常使用到一些pdf文件,这些pdf文件如果太大的话我们是可以进行在线压缩的,那么我们是使用什么样的方式将pdf文件在线压缩的?下面小编就简单给大家介绍一下. 步骤一:我们需要将这样大的pdf文件准备好放在桌面上,查看一下视频文件的大小,然后再通过电脑上的百度浏览器进行搜索迅捷在线压缩找到在线压缩网站中去: 步骤二:当我们进入之后就可以进行压缩设置,将文件的压缩质量进行设置好:步骤三:把需要上传的pdf文件直接拖动到界面中去,或者是直接点击界面进行上传即可:步

Java Web 减少网络 IO、静态资源磁盘 IO 有效的办法--响应使用 GZIP( 压缩http请求与响应gzip压缩)

(转载http://blog.csdn.net/hylclxy/article/details/7779662) 出于节约流量考虑, 客户端在向服务端发送request的时候对post数据进行gzip压缩, 同时服务端把返回的数据也进行gzip压缩. 为防止遗忘, 记录在此.   编写工具类GzipUtil.java, 开始没考虑好, 方法实现得较乱: public static String METHOD_POST = "POST"; public static final Stri

shell文本处理——最基本方法压缩js文件

关于javascript代码文件的压缩在之前的文章中提到过(http://blog.csdn.net/u010487568/article/details/19701575),一般来说有三种方式: 仅压缩空白.注释等字符(最基本方法) 压缩空白.注释并替换变量名 压缩恐怖.注释.替换变量名,同时最小化文件所有的单词 最近在进一步学习shell,对这个古老的工具越发的感到高效便捷,因此对于这个主题实现了shell版本的最基本方法的实现. 主要的策略如下: 去除单行注释 去除换行符和制表符 压缩多个

Linux 入门之文件的压缩和归档

Linux入门之压缩与归档 LInux中的有很多对文件压缩和归档的工具,而且其压缩的算法也在不段的更新和突破,但是作为对数据的稳定一般常用的工具不会太多,下面看看一些压缩工具吧,这里我在RHEL5 (red hat 5)或CentOS 6版本的系统上列举这些工具 compress 这是一个很老旧的工具了,一般只有系统内核上的弄些不常改变的文件使用此工具压缩,但是这个工具对于小型数据的压缩效果还是不会很差的. #使用rpm测试软件包是否已经安装 [[email protected] ~]# rpm

脚本基础,文件查找,文件打包压缩。

本周知识点: ''' 1.文本处理工具和正则表达式 抽取文本的工具: 文件内容:cat,用于查看文件内容的基本命令,-E显示行结束符$ -n 显示行号 -A显示所有控制符-b 非空行编号 -s 压缩连续的空行成一行.hexdump :可以查看文件的ASCII值more :分页查看文件 -d 显示翻页及退出提示less : 一页一页地查看文件. /文本 搜索文本 n/N 跳到下一个或上一个匹配 显示文本前或后行内容 head : -c# 指定获取前#字节 -n# 指定获取前#行 (n可以省略)ta