Auf Englisch lesen

Freigeben über


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).

Allgemeine Datei-Dekomprimierung

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.

Allgemeine Dateikomprimierung

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
    }

Asynchrone Unterstützung

Unterstützt CompressionStream alle asynchronen Vorgänge, die System.IO.DeflateStreamvon 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.