在C#开发过程中,文件压缩是处理大文件传输、存储优化的常见需求,目前主流的压缩算法包括GZip、Deflate、Brotli、Zstd,它们各自有不同的性能表现和适用场景,开发者需要根据实际业务需求选择合适的算法。

四种压缩算法核心特点对比
为了更直观地了解四种算法的差异,我们从压缩率、压缩速度、解压速度、适用场景四个维度做对比:
| 算法名称 | 压缩率 | 压缩速度 | 解压速度 | 适用场景 |
|---|---|---|---|---|
| GZip | 中等 | 中等 | 较快 | 通用文件压缩、HTTP传输压缩 |
| Deflate | 中等 | 较快 | 快 | 轻量压缩需求、流式数据处理 |
| Brotli | 高 | 较慢 | 较快 | 静态资源压缩、网络传输优化 |
| Zstd | 高 | 快 | 极快 | 大文件压缩、实时数据传输 |
GZip算法的使用
GZip是C#中最常用的压缩算法之一,基于Deflate算法封装了文件头和信息校验,使用System.IO.Compression命名空间下的类即可实现。
压缩文件示例
using System;
using System.IO;
using System.IO.Compression;
class GZipDemo
{
static void CompressFile(string sourcePath, string targetPath)
{
// 打开源文件读取流
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
// 创建目标文件写入流
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建GZip压缩流,绑定到目标流
using (GZipStream gzipStream = new GZipStream(targetStream, CompressionMode.Compress))
{
// 将源文件内容复制到压缩流,完成压缩
sourceStream.CopyTo(gzipStream);
}
}
}
Console.WriteLine("GZip压缩完成");
}
static void DecompressFile(string sourcePath, string targetPath)
{
// 打开压缩文件读取流
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
// 创建解压后文件写入流
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建GZip解压流,绑定到源流
using (GZipStream gzipStream = new GZipStream(sourceStream, CompressionMode.Decompress))
{
// 将解压流内容复制到目标流,完成解压
gzipStream.CopyTo(targetStream);
}
}
}
Console.WriteLine("GZip解压完成");
}
}
Deflate算法的使用
Deflate是更基础的压缩算法,没有额外的文件头封装,压缩和解压速度更快,适合对体积要求不高的流式数据处理场景。
压缩文件示例
using System;
using System.IO;
using System.IO.Compression;
class DeflateDemo
{
static void CompressFile(string sourcePath, string targetPath)
{
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建Deflate压缩流
using (DeflateStream deflateStream = new DeflateStream(targetStream, CompressionMode.Compress))
{
sourceStream.CopyTo(deflateStream);
}
}
}
Console.WriteLine("Deflate压缩完成");
}
static void DecompressFile(string sourcePath, string targetPath)
{
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建Deflate解压流
using (DeflateStream deflateStream = new DeflateStream(sourceStream, CompressionMode.Decompress))
{
deflateStream.CopyTo(targetStream);
}
}
}
Console.WriteLine("Deflate解压完成");
}
}
Brotli算法的使用
Brotli是Google推出的压缩算法,压缩率高于GZip,适合静态资源压缩场景,C#中同样在System.IO.Compression命名空间下提供支持。
压缩文件示例
using System;
using System.IO;
using System.IO.Compression;
class BrotliDemo
{
static void CompressFile(string sourcePath, string targetPath)
{
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建Brotli压缩流
using (BrotliStream brotliStream = new BrotliStream(targetStream, CompressionMode.Compress))
{
sourceStream.CopyTo(brotliStream);
}
}
}
Console.WriteLine("Brotli压缩完成");
}
static void DecompressFile(string sourcePath, string targetPath)
{
using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open))
{
using (FileStream targetStream = new FileStream(targetPath, FileMode.Create))
{
// 创建Brotli解压流
using (BrotliStream brotliStream = new BrotliStream(sourceStream, CompressionMode.Decompress))
{
brotliStream.CopyTo(targetStream);
}
}
}
Console.WriteLine("Brotli解压完成");
}
}
Zstd算法的使用
Zstd是Facebook推出的高性能压缩算法,压缩率和速度表现均衡,解压速度极快,C#中需要通过NuGet安装ZstdNet包使用。
安装依赖
在NuGet包管理器中搜索安装ZstdNet,或者通过命令行安装:
dotnet add package ZstdNet
压缩文件示例
using System;
using System.IO;
using ZstdNet;
class ZstdDemo
{
static void CompressFile(string sourcePath, string targetPath)
{
// 创建Zstd压缩器
using (var compressor = new Compressor())
{
// 读取源文件所有字节
byte[] sourceBytes = File.ReadAllBytes(sourcePath);
// 执行压缩
byte[] compressedBytes = compressor.Wrap(sourceBytes);
// 写入压缩后的文件
File.WriteAllBytes(targetPath, compressedBytes);
}
Console.WriteLine("Zstd压缩完成");
}
static void DecompressFile(string sourcePath, string targetPath)
{
// 创建Zstd解压器
using (var decompressor = new Decompressor())
{
// 读取压缩文件所有字节
byte[] compressedBytes = File.ReadAllBytes(sourcePath);
// 执行解压
byte[] decompressedBytes = decompressor.Unwrap(compressedBytes);
// 写入解压后的文件
File.WriteAllBytes(targetPath, decompressedBytes);
}
Console.WriteLine("Zstd解压完成");
}
}
算法选择建议
开发者可以根据以下场景选择对应的算法:
- 如果是通用的文件压缩需求,对兼容性要求高,优先选择GZip,几乎所有系统都支持GZip解压。
- 如果是流式数据处理,对压缩速度要求高,不需要额外文件头信息,选择Deflate。
- 如果是静态资源压缩,比如网站的前端CSS、JS文件,对压缩率要求高,不介意压缩耗时稍长,选择Brotli。
- 如果是大文件压缩、实时数据传输场景,需要兼顾压缩率和压缩解压速度,优先选择Zstd。
注意:所有压缩算法的压缩率和速度都可以通过调整压缩级别参数优化,比如GZip可以通过GZipStream的构造函数传入CompressionLevel枚举调整压缩级别,级别越高压缩率越高但速度越慢。