Komprimering
System.IO.Compression innehåller klasser för att komprimera och dekomprimera data. Du kan använda det för att spara diskutrymme, snabba upp nätverksöverföring eller hantera komprimerade filer som .gz och .zst.
När du läst detta ska du kunna
- Komprimera och dekomprimera med GZip
- Använda Zstandard (zstd) för snabbare komprimering
- Omsluta befintlig data med
ReadOnlyMemoryStreamutan kopiering - Välja rätt komprimeringsformat för situationen
GZip — standardvalet
GZip är välkänt och stöds överallt. Använd GZipStream för att komprimera till en fil eller ett minne:
using System.IO.Compression;
// Komprimera en sträng till en byte-arraybyte[] Compress(string text){ var input = Encoding.UTF8.GetBytes(text);
using var output = new MemoryStream(); using (var gzip = new GZipStream(output, CompressionMode.Compress)) gzip.Write(input);
return output.ToArray();}
// Dekomprimera tillbaka till strängstring Decompress(byte[] compressed){ using var input = new MemoryStream(compressed); using var gzip = new GZipStream(input, CompressionMode.Decompress); using var reader = new StreamReader(gzip, Encoding.UTF8);
return reader.ReadToEnd();}var original = "Hej, det här är en lång text som komprimeras!";var compressed = Compress(original);var restored = Decompress(compressed);
Console.WriteLine($"Original: {original.Length} tecken");Console.WriteLine($"Komprimerad: {compressed.Length} bytes");Console.WriteLine($"Återställd: {restored}");Zstandard (zstd) — snabbare och effektivare
Zstandard är ett modernare format som komprimerar snabbare än GZip och ofta ger bättre kompressionsnivå. Det används bland annat av Facebook och i Linux-kerneln.
ZstdStream finns i System.IO.Compression och fungerar på samma sätt som GZipStream:
using System.IO.Compression;
byte[] CompressZstd(byte[] data){ using var output = new MemoryStream(); using (var zstd = new ZstdStream(output, CompressionMode.Compress)) zstd.Write(data);
return output.ToArray();}
byte[] DecompressZstd(byte[] compressed){ using var input = new MemoryStream(compressed); using var zstd = new ZstdStream(input, CompressionMode.Decompress); using var result = new MemoryStream();
zstd.CopyTo(result); return result.ToArray();}ReadOnlyMemoryStream — nollkopiering
Ofta har du data i minnet som en byte[] eller ReadOnlyMemory<byte> och vill läsa den som en Stream — till exempel för att skicka den till en komprimeringsström. MemoryStream kopierar datan. ReadOnlyMemoryStream gör det inte:
byte[] data = GetDataFromSomewhere();
// Gamla sättet — kopierar datanusing var old = new MemoryStream(data);
// Nya sättet — ingen kopieringusing var efficient = new ReadOnlyMemoryStream(data);
using var zstd = new ZstdStream(efficient, CompressionMode.Compress);using var output = new MemoryStream();zstd.CopyTo(output);ReadOnlyMemoryStream är snabbare och förbrukar mindre minne när du arbetar med stora datamängder.
Komprimera en fil
void CompressFile(string inputPath, string outputPath){ using var input = File.OpenRead(inputPath); using var output = File.Create(outputPath); using var gzip = new GZipStream(output, CompressionLevel.SmallestSize);
input.CopyTo(gzip);}
void DecompressFile(string inputPath, string outputPath){ using var input = File.OpenRead(inputPath); using var gzip = new GZipStream(input, CompressionMode.Decompress); using var output = File.Create(outputPath);
gzip.CopyTo(output);}CompressFile("rapport.txt", "rapport.txt.gz");DecompressFile("rapport.txt.gz", "rapport-restored.txt");CompressionLevel
// Välj nivå baserat på prioritetCompressionLevel.Fastest // Snabb, sämre kompressionCompressionLevel.Optimal // BalansCompressionLevel.SmallestSize // Långsam, bästa kompressionCompressionLevel.NoCompression // Ingen komprimering — bara overheadJämförelse — format
| Format | Hastighet | Kompression | Användning |
|---|---|---|---|
| GZip | Medel | Bra | Webb, filer — universellt stöd |
| Deflate | Snabb | OK | Inbäddad i GZip och ZIP |
| Zstandard | Snabb | Mycket bra | Loggfiler, nätverk, stora datamängder |
TL;DR
// GZip — standardvalet, fungerar överalltusing var gzip = new GZipStream(output, CompressionMode.Compress);
// Zstandard — snabbare och effektivareusing var zstd = new ZstdStream(output, CompressionMode.Compress);
// Läs befintlig byte[] som stream utan kopieringusing var stream = new ReadOnlyMemoryStream(data);