ZetCode

Dart ZLibEncoder

last modified April 4, 2025

The ZLibEncoder class in Dart provides zlib compression functionality. It's useful for reducing data size for storage or network transmission.

ZLibEncoder implements the DEFLATE compression algorithm with zlib headers and trailers. It's part of Dart's dart:io and dart:zlib libraries.

Basic Definition

ZLibEncoder is a converter that compresses byte data using zlib. It supports different compression levels and produces standard zlib format output.

Key features include configurable compression level, stream support, and compatibility with other zlib implementations. It's efficient for text and binary data compression.

Basic ZLibEncoder Usage

This example shows basic compression of a string using ZLibEncoder.

main.dart
import 'dart:convert';
import 'dart:zlib';

void main() {
  final encoder = ZLibEncoder();
  final text = 'Hello, world! This is a test string for compression.';
  
  final compressed = encoder.encode(utf8.encode(text));
  print('Original size: ${text.length}');
  print('Compressed size: ${compressed.length}');
  print('Compression ratio: ${(compressed.length/text.length).toStringAsFixed(2)}');
}

We create a ZLibEncoder, encode a UTF-8 string, and compare sizes. The encoder handles the compression process automatically with default settings.

$ dart main.dart
Original size: 47
Compressed size: 35
Compression ratio: 0.74

Compression with Different Levels

This example demonstrates using different compression levels with ZLibEncoder.

main.dart
import 'dart:convert';
import 'dart:zlib';

void main() {
  final text = 'Hello, world! '.codeUnits * 100; // Repeat 100 times
  final bytes = Uint8List.fromList(text);
  
  for (var level in [ZLibOption.minLevel, ZLibOption.defaultLevel, ZLibOption.maxLevel]) {
    final encoder = ZLibEncoder(level: level);
    final compressed = encoder.encode(bytes);
    
    print('Level $level: ${compressed.length} bytes');
  }
}

We test different compression levels on repeated text. Higher levels typically produce smaller output but may take more time to compress.

$ dart main.dart
Level 1: 60 bytes
Level 6: 56 bytes
Level 9: 56 bytes

Stream Compression

This example shows how to compress data streams using ZLibEncoder.

main.dart
import 'dart:convert';
import 'dart:zlib';
import 'dart:async';

Future<void> main() async {
  final encoder = ZLibEncoder();
  final controller = StreamController<List<int>>();
  
  // Create a stream of data chunks
  final stream = controller.stream;
  controller.add(utf8.encode('First chunk of data '));
  controller.add(utf8.encode('Second chunk of data '));
  controller.add(utf8.encode('Third chunk of data'));
  await controller.close();
  
  // Compress the stream
  final compressedStream = stream.transform(encoder);
  
  // Collect compressed data
  final compressedBytes = await compressedStream.toList();
  final totalSize = compressedBytes.fold(0, (sum, chunk) => sum + chunk.length);
  
  print('Compressed size: $totalSize bytes');
}

We create a stream of data chunks and compress them using ZLibEncoder as a stream transformer. This is efficient for large data that can't fit in memory at once.

$ dart main.dart
Compressed size: 53 bytes

File Compression

This example demonstrates compressing a file's contents using ZLibEncoder.

main.dart
import 'dart:io';
import 'dart:zlib';

Future<void> main() async {
  final file = File('example.txt');
  final encoder = ZLibEncoder(level: ZLibOption.maxLevel);
  
  // Read file contents
  final contents = await file.readAsBytes();
  print('Original size: ${contents.length} bytes');
  
  // Compress contents
  final compressed = encoder.encode(contents);
  print('Compressed size: ${compressed.length} bytes');
  
  // Write compressed data to new file
  final compressedFile = File('example.txt.z');
  await compressedFile.writeAsBytes(compressed);
  print('Compressed file written');
}

We read a file, compress its contents with maximum compression level, and write the compressed data to a new file. This shows practical file compression usage.

$ dart main.dart
Original size: 1024 bytes
Compressed size: 543 bytes
Compressed file written

Network Data Compression

This example shows compressing data for network transmission.

main.dart
import 'dart:convert';
import 'dart:zlib';
import 'dart:io';

Future<void> main() async {
  final server = await HttpServer.bind('localhost', 8080);
  print('Server running on ${server.address}:${server.port}');
  
  await for (var request in server) {
    if (request.method == 'POST') {
      final encoder = ZLibEncoder();
      final data = await request.fold([], (list, chunk) => list..addAll(chunk));
      
      final compressed = encoder.encode(data);
      request.response
        ..headers.add('Content-Encoding', 'deflate')
        ..add(compressed)
        ..close();
    } else {
      request.response
        ..statusCode = HttpStatus.methodNotAllowed
        ..write('Only POST supported')
        ..close();
    }
  }
}

We create a simple HTTP server that compresses POST data responses. This reduces network bandwidth usage while maintaining data integrity.

$ dart main.dart
Server running on InternetAddress('127.0.0.1', IPv4):8080

Best Practices

Source

Dart ZLibEncoder Documentation

This tutorial covered Dart's ZLibEncoder class with practical examples showing basic usage, compression levels, streaming, and file/network applications.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Dart tutorials.