Dateikomprimierung in Xamarin.iOS
Xamarin-Apps für iOS 9.0 oder macOS 10.11 (und höher) können das Compression Framework verwenden, um Daten zu komprimieren (codieren) und zu dekomprimieren (decodieren). Xamarin.iOS stellt dieses Framework nach der Stream-API bereit. Das Komprimierungsframework ermöglicht Es Entwicklern, mit den komprimierten und dekomprimierten Daten zu interagieren, als ob es sich um normale Streams handelt, ohne Rückrufe oder Delegaten verwenden zu müssen.
Das Komprimierungsframework bietet Unterstützung für die folgenden Algorithmen:
- LZ4
- LZ4 Raw
- Lzfse
- Lzma
- Zlib
Mithilfe des Komprimierungsframeworks können Entwickler Komprimierungsvorgänge ohne Drittanbieterbibliotheken oder NuGets ausführen. Dadurch werden externe Abhängigkeiten reduziert und sichergestellt, dass die Komprimierungsvorgänge auf allen Plattformen unterstützt werden (sofern sie die Mindestanforderungen an das Betriebssystem erfüllen).
Das Komprimierungsframework verwendet eine Stream-API in Xamarin.iOS und Xamarin.Mac. Diese API bedeutet, dass der Entwickler zum Komprimieren von Daten die normalen Muster verwenden kann, die in anderen E/A-APIs in .NET verwendet werden. Im folgenden Beispiel wird gezeigt, wie Sie Daten mit dem Komprimierungsframework dekomprimieren, das der API in der System.IO.Compression.DeflateStream
API ähnelt:
// sample zlib data
static byte [] compressed_data = { 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0xe7, 0x02, 0x00 };
using (var backing = new MemoryStream (compressed_data)) // compress data to read
using (var decompressing = new CompressionStream (backing, CompressionMode.Decompress, CompressionAlgorithm.Zlib)) // create decompression stream with the correct algorithm
using (var reader = new StreamReader (decompressing))
{
// perform the required stream operations
Console.WriteLine (reader.ReadLine ());
}
Implementiert CompressionStream
die IDisposable
-Schnittstelle wie andere System.IO.Streams
, sodass Entwickler sicherstellen sollten, dass Ressourcen freigegeben werden, sobald sie nicht mehr benötigt werden.
Mit der Komprimierungs-API können Entwickler auch Daten mithilfe derselben API komprimieren. Daten können mithilfe eines der im CompressionAlgorithm
Enumerator angegebenen Algorithmen komprimiert werden.
// sample method that copies the data from the source stream to the destination stream
static void CopyStream (Stream src, Stream dest)
{
byte[] array = new byte[1024];
int bytes_read;
bytes_read = src.Read (array, 0, 1024);
while (bytes_read != 0) {
dest.Write (array, 0, bytes_read);
bytes_read = src.Read (array, 0, 1024);
}
}
static void CompressExample ()
{
// create some sample data to compress
byte [] data = new byte[100000];
for (int i = 0; i < 100000; i++) {
data[i] = (byte) i;
}
using (var dataStream = new MemoryStream (data)) // stream that contains the data to compress
using (var backing = new MemoryStream ()) // stream in which the compress data will be written
using (var compressing = new CompressionStream (backing, CompressionMode.Compress, CompressionAlgorithm.Zlib, true))
{
// copy the data to the compressing stream
CopyStream (dataStream, compressing);
// at this point, the CompressionStream contains all the data from the dataStream but compressed
// using the zlib algorithm
}
Unterstützt CompressionStream
alle asynchronen Vorgänge, die System.IO.DeflateStream
von unterstützt werden. Dies bedeutet, dass Entwickler die asynchrone Schlüsselwort (keyword) verwenden können, um die Komprimierungs-/Dekomprimierungsvorgänge auszuführen, ohne den UI-Thread zu blockieren.