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

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
{
    /// <summary>
    /// 压缩文本、字节或者文件的压缩辅助类
    /// </summary>
    public class GZipHelper
    {
        /// <summary>
        /// 压缩字符串
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static string Compress(string text)
        {
            // convert text to bytes
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            // get a stream
            MemoryStream ms = new MemoryStream();
            // get ready to zip up our stream
            using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
            {
                // compress the data into our buffer
                zip.Write(buffer, 0, buffer.Length);
            }
            // reset our position in compressed stream to the start
            ms.Position = 0;
            // get the compressed data
            byte[] compressed = ms.ToArray();
            ms.Read(compressed, 0, compressed.Length);
            // prepare final data with header that indicates length
            byte[] gzBuffer = new byte[compressed.Length + 4];
            //copy compressed data 4 bytes from start of final header
            System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
            // copy header to first 4 bytes
            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
            // convert back to string and return
            return Convert.ToBase64String(gzBuffer);
        }

        /// <summary>
        /// 解压字符串
        /// </summary>
        /// <param name="compressedText"></param>
        /// <returns></returns>
        public static string Uncompress(string compressedText)
        {
            // get string as bytes
            byte[] gzBuffer = Convert.FromBase64String(compressedText);
            // prepare stream to do uncompression
            MemoryStream ms = new MemoryStream();
            // get the length of compressed data
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            // uncompress everything besides the header
            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
            // prepare final buffer for just uncompressed data
            byte[] buffer = new byte[msgLength];
            // reset our position in stream since we‘re starting over
            ms.Position = 0;
            // unzip the data through stream
            GZipStream zip = new GZipStream(ms, CompressionMode.Decompress);
            // do the unzip
            zip.Read(buffer, 0, buffer.Length);
            // convert back to string and return
            return Encoding.UTF8.GetString(buffer);
        }

        public static T GZip<T>(Stream stream, CompressionMode mode) where T : Stream
        {
            byte[] writeData = new byte[4096];
            T ms = default(T);
            using (Stream sg = new GZipStream(stream, mode))
            {
                while (true)
                {
                    Array.Clear(writeData, 0, writeData.Length);
                    int size = sg.Read(writeData, 0, writeData.Length);
                    if (size > 0)
                    {
                        ms.Write(writeData, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                return ms;
            }
        }

        /// <summary>
        /// 压缩字节
        /// </summary>
        /// <param name="bytData"></param>
        /// <returns></returns>
        public static byte[] Compress(byte[] bytData)
        {
            using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Compress))
            {
                return stream.ToArray();
            }
        }

        /// <summary>
        /// 解压字节
        /// </summary>
        /// <param name="bytData"></param>
        /// <returns></returns>
        public static byte[] Decompress(byte[] bytData)
        {
            using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Decompress))
            {
                return stream.ToArray();
            }
        }

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="sourceFile">源文件</param>
        /// <param name="destinationFile">目标文件</param>
        public static void CompressFile(string sourceFile, string destinationFile)
        {
            if (File.Exists(sourceFile) == false) //判断文件是否存在
                throw new FileNotFoundException();
            if (File.Exists(destinationFile) == false) //判断目标文件文件是否存在
                FileHelper.DeleteFile(destinationFile);
            //创建文件流和字节数组
            byte[] buffer = null;
            FileStream sourceStream = null;
            FileStream destinationStream = null;
            GZipStream compressedStream = null;
            try
            {
                sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                buffer = new byte[sourceStream.Length];
                //把文件流存放到字节数组中
                int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);
                if (checkCounter != buffer.Length)
                {
                    throw new ApplicationException();
                }
                destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write);
                //创建GzipStream实例,写入压缩的文件流
                compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true);
                compressedStream.Write(buffer, 0, buffer.Length);
            }
            finally
            {
                // Make sure we allways close all streams
                if (sourceStream != null)
                { sourceStream.Close(); }
                if (compressedStream != null)
                { compressedStream.Close(); }
                if (destinationStream != null)
                { destinationStream.Close(); }
            }
        }

        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="sourceFile">源文件</param>
        /// <param name="destinationFile">目标文件</param>
        public static void DecompressFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile))
            {
                throw new FileNotFoundException();
            }
            FileStream stream = null;
            FileStream stream2 = null;
            GZipStream stream3 = null;
            byte[] buffer = null;
            try
            {
                stream = new FileStream(sourceFile, FileMode.Open);
                stream3 = new GZipStream(stream, CompressionMode.Decompress, true);
                buffer = new byte[4];
                int num = ((int)stream.Length) - 4;
                stream.Position = num;
                stream.Read(buffer, 0, 4);
                stream.Position = 0L;
                byte[] buffer2 = new byte[BitConverter.ToInt32(buffer, 0) + 100];
                int offset = 0;
                int count = 0;
                while (true)
                {
                    int num5 = stream3.Read(buffer2, offset, 100);
                    if (num5 == 0)
                    {
                        break;
                    }
                    offset += num5;
                    count += num5;
                }
                stream2 = new FileStream(destinationFile, FileMode.Create);
                stream2.Write(buffer2, 0, count);
                stream2.Flush();
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                if (stream3 != null)
                {
                    stream3.Close();
                }
                if (stream2 != null)
                {
                    stream2.Close();
                }
            }
        }
    }
}
时间: 2024-10-22 19:50:46

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

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

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

压缩文本、字节或者文件的压缩辅助类-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