C# 之 GZipStream压缩流

第一次接触,对于GZIPStream的两个方法有点疑惑:

  • 该对象的Write方法原型:

void GZipStream.Write(byte[] array,int offset,int count)
从指定的字节数组中将压缩的字节写入基础流

这样看解释是先要调用这个方法,通过GZipStream读取后在压缩吗?

  • 该对象的Read方法原型:

int GZipStream.Read(byte[] array,int offset,int count)
将若干解压的字节读入指定的字节数组


接下来看代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _压缩流
{
class Program
{
static void Main(string[] args)
{
//压缩源(被压缩的文件)
string source = @”C:\Users\Administrator\Desktop\test.txt”;
//压缩目标(压缩好的文件写到某个路径下);
string target = @”C:\Users\Administrator\Desktop\YaSuo”;

        //将压缩文件解压到该路径下
        string deTarget = @"C:\Users\Administrator\Desktop\解压后.txt";

        Compress(source, target);
        DeCompress(target, deTarget);
    }
    /// 
    /// 压缩
    /// 
    /// 未压缩的文件路径
    /// 压缩后数据存放的文件路径
    private static void Compress(string source, string target)
    {
        //1.读取源文件(读取到源文件是未压缩的)
        using (FileStream fsRead = new FileStream(source, FileMode.OpenOrCreate, FileAccess.Read))
        {
            //要将读取到的内容压缩,就是要写入到一个新的文件;所以创建一个新的写入文件的文件流
            using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write))
            {
                //因为在写入的时候要压缩后写入,所以需要创建压缩流来写入(因此在压缩写入前需要先创建写入流)
                //压缩的时候就是要将压缩好的数据写入到指定流中,通过fsWrite写入到新的路径下
                using (GZipStream zip = new GZipStream(fsWrite, CompressionMode.Compress))
                {
                    //循环读取,每次从fsRead读取一部分,压缩就写入一部分
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    //读取流每次读取buffer数组的大小
                    int r = fsRead.Read(buffer, 0, buffer.Length);
                    while (r > 0)
                    {
                        //写入,用压缩流来写入,这样写入的才是压缩后的数据
                        //压缩流要从 读取流中读取到的文件数据的数组 中调用Write方法将压缩字节写入基础流(fsWrite)
                        zip.Write(buffer, 0, r); //从读取到内容的数组中读取0到实际读取到的字节数进行压缩
                        //继续从未压缩的文件中读取数据
                        r = fsRead.Read(buffer, 0, buffer.Length);
                    }
                }
            }
        }
        Console.WriteLine("压缩成功");
    }

    /// 
    /// 解压
    /// 
    /// 被解压的文件
    /// 解压后数据存放的路径
    public static void DeCompress(string source, string target)
    {
        //将要被解压的文件读取进来
        using (FileStream fsRead = new FileStream(source, FileMode.OpenOrCreate, FileAccess.Read))
        {
            //创建压缩流,根据fsRead读取到压缩内容进行解压(通过deZip读取,读取到的就是解压后的内容)
            using (GZipStream deZip = new GZipStream(fsRead, CompressionMode.Decompress))
            {
                //要解压到一个新的文件中,所以需要一个写入文件的文件流
                using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    //注:读取的时候是通过压缩流来读取,这样读取到的才是解压后的内容
                    int r = deZip.Read(buffer, 0, buffer.Length);   //deZip从fsRead流中读取数据解压到buffer数组中
                    while (r > 0)
                    {
                        //通过fsWrite流将存放解压后数据的buffer写入到指定路径下
                        fsWrite.Write(buffer, 0, r);
                        //循环写入
                        r = deZip.Read(buffer, 0, buffer.Length);
                    }
                }
            }
        }
        Console.WriteLine("解压成功");
    }
  }
}

运行结果,源文件经过压缩大小只有120字节,而解压后,源文件与解压后txt的大小一致

C# 之 GZipStream压缩流_第1张图片

你可能感兴趣的:(C#)