Compresión de archivos en Xamarin.iOS
Las aplicaciones de Xamarin creadas para iOS 9.0 o macOS 10.11 (y versiones posteriores) pueden usar el marco de compresión para comprimir (codificar) y descomprimir (descodificar) datos. Xamarin.iOS proporciona este marco siguiendo la API de Stream. El marco de compresión permite a los desarrolladores interactuar con los datos comprimidos y descomprimidos como si fueran secuencias normales sin necesidad de usar devoluciones de llamada o delegados.
El marco de compresión proporciona compatibilidad con los algoritmos siguientes:
- LZ4
- LZ4 Raw
- Lzfse
- Lzma
- Zlib
El uso del marco de compresión permite a los desarrolladores realizar operaciones de compresión sin bibliotecas de terceros ni paquetes NuGet. Esto reduce las dependencias externas y garantiza que las operaciones de compresión se admiten en todas las plataformas (siempre que cumplan los requisitos mínimos del sistema operativo).
El marco de compresión usa una API de secuencia en Xamarin.iOS y Xamarin.Mac. Esta API significa que para comprimir datos, el desarrollador puede usar los patrones normales que se usan en otras API de E/S dentro de .NET. En el ejemplo siguiente se muestra cómo descomprimir datos con el marco de compresión, que es similar a la API que se encuentra en la API System.IO.Compression.DeflateStream
:
// 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 ());
}
CompressionStream
implementa la interfaz IDisposable
, al igual que otros elementos System.IO.Streams
, por lo que los desarrolladores deben asegurarse de que se liberen recursos cuando ya no sean necesarios.
La API de compresión también permite a los desarrolladores comprimir datos después de la misma API. Los datos se pueden comprimir mediante uno de los algoritmos proporcionados indicados en el enumerador CompressionAlgorithm
.
// 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
}
CompressionStream
admite todas las operaciones asincrónicas compatibles con System.IO.DeflateStream
, lo que significa que los desarrolladores pueden usar la palabra clave async para realizar las operaciones de compresión y descompresión sin bloquear el subproceso de la interfaz de usuario.