ZetCode

Dart GZipCodec

最后修改于 2025 年 4 月 4 日

Dart 中的 GZipCodec 类提供了 GZIP 压缩和解压缩功能。它是 Dart dart:iodart:convert 库的一部分,用于高效的数据处理。

GZipCodec 实现了 Codec 接口,允许进行编码(压缩)和解码(解压缩)操作。它对于减小数据大小以进行存储或传输非常有用。

基本定义

GZipCodec 是一种实现 GZIP 格式的压缩编解码器。它使用 DEFLATE 算法压缩字节数组或流。

主要功能包括可配置的压缩级别、流支持以及与标准 GZIP 文件格式的兼容性。它为压缩数据添加了适当的头和尾。

基本压缩示例

此示例展示了使用 GZipCodec 进行的基本字符串压缩。

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

void main() {
  final text = 'This is a sample text to compress with GZipCodec in Dart.';
  final bytes = utf8.encode(text);
  
  final compressed = gzip.encode(bytes);
  print('Compressed size: ${compressed.length} bytes');
  
  final decompressed = gzip.decode(compressed);
  print('Original text: ${utf8.decode(decompressed)}');
}

我们将字符串转换为字节,使用 gzip.encode 进行压缩,然后解压缩回原始字符串。gzip 对象是 GZipCodec 的预定义实例。

$ dart main.dart
Compressed size: 62 bytes
Original text: This is a sample text to compress with GZipCodec in Dart.

文件压缩

此示例演示了文件的压缩和解压缩。

main.dart
import 'dart:io';

Future<void> main() async {
  final inputFile = File('input.txt');
  final compressedFile = File('compressed.gz');
  final outputFile = File('output.txt');
  
  // Compress file
  final bytes = await inputFile.readAsBytes();
  final compressed = gzip.encode(bytes);
  await compressedFile.writeAsBytes(compressed);
  
  // Decompress file
  final decompressed = gzip.decode(compressed);
  await outputFile.writeAsBytes(decompressed);
  
  print('Original size: ${bytes.length}');
  print('Compressed size: ${compressed.length}');
  print('Decompressed matches original: ${bytes.length == decompressed.length}');
}

我们读取一个文件,将其内容压缩到一个 .gz 文件,然后解压缩回来。该示例展示了完整的文件压缩往返过程。

$ dart main.dart
Original size: 1024
Compressed size: 512
Decompressed matches original: true

自定义压缩级别

此示例展示了如何使用不同的压缩级别。

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

void main() {
  final text = 'Repeated text. ' * 100;
  final bytes = utf8.encode(text);
  
  final fast = GZipCodec(level: 1).encode(bytes);
  final balanced = GZipCodec(level: 6).encode(bytes);
  final best = GZipCodec(level: 9).encode(bytes);
  
  print('Fast compression size: ${fast.length}');
  print('Balanced compression size: ${balanced.length}');
  print('Best compression size: ${best.length}');
}

我们创建具有不同压缩级别的 GZipCodec 实例。较高的级别会产生更小的输出,但会消耗更多 CPU 时间。

$ dart main.dart
Fast compression size: 168
Balanced compression size: 128
Best compression size: 120

流式压缩

此示例演示了大型数据的流式压缩。

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

Future<void> main() async {
  final input = File('large_file.txt').openRead();
  final output = File('compressed_stream.gz').openWrite();
  
  // Compress stream
  await input.pipe(gzip.encoder).pipe(output);
  
  print('Stream compression complete');
}

我们使用 pipe() 压缩大型文件流,而无需将其全部加载到内存中。gzip.encoder 会实时转换流。

$ dart main.dart
Stream compression complete

HTTP 压缩

此示例展示了 GZipCodec 在 HTTP 响应中的使用。

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

Future<void> main() async {
  final server = await HttpServer.bind('localhost', 8080);
  print('Server running on ${server.address}:${server.port}');
  
  await for (final request in server) {
    final response = request.response;
    final text = 'Compressed HTTP response ' * 100;
    
    // Enable GZIP compression
    response.headers.add('Content-Encoding', 'gzip');
    response.add(gzip.encode(utf8.encode(text)));
    
    await response.close();
  }
}

我们创建了一个发送 GZIP 压缩响应的 HTTP 服务器。当设置 Content-Encoding 标头时,客户端会自动解压缩。

$ dart main.dart
Server running on localhost:8080

最佳实践

来源

Dart GZipCodec 文档

本教程通过实际示例涵盖了 Dart 的 GZipCodec 类,展示了基本用法、文件操作、流式处理和 HTTP 集成。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程