Dart ZLibCodec
最后修改于 2025 年 4 月 4 日
Dart 中的 ZLibCodec 类提供了 zlib 压缩和解压缩功能。它对于减小存储或传输的数据量很有用。
ZLibCodec 使用 zlib 包装器实现了 DEFLATE 压缩算法。它是 Dart 的 dart:io 和 dart:convert 库的一部分。
基本定义
ZLibCodec 是一种使用 zlib 格式压缩和解压缩字节数据的编解码器。它支持不同的压缩级别和策略。
主要功能包括可配置的压缩级别、流式支持以及与标准 zlib 实现的兼容性。它同时支持 List<int> 和 Stream<List<int>> 数据。
基本压缩
此示例展示了使用 ZLibCodec 对字符串进行基本压缩。
main.dart
import 'dart:convert';
void main() {
final codec = ZLibCodec();
final text = 'The quick brown fox jumps over the lazy dog';
final compressed = codec.encode(utf8.encode(text));
print('Compressed: $compressed');
final decompressed = utf8.decode(codec.decode(compressed));
print('Decompressed: $decompressed');
}
我们创建一个 ZLibCodec 实例,将字符串编码为 UTF-8 字节,然后进行压缩。之后,将压缩数据解压缩回原始字符串。
$ dart main.dart Compressed: [120, 156, 11, 201, 200, 44, 86, 0, 161, 52, 119, 23, 114, 233, 142, 6, 151, 128, 148, 210, 236, 146, 212, 226, 202, 212, 226, 140, 148, 210, 210, 156, 212, 18, 0, 237, 147, 15, 76] Decompressed: The quick brown fox jumps over the lazy dog
带级别的压缩
此示例演示了使用不同的压缩级别。
main.dart
import 'dart:convert';
void main() {
final text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
final bytes = utf8.encode(text);
for (var level = 1; level <= 9; level++) {
final codec = ZLibCodec(level: level);
final compressed = codec.encode(bytes);
print('Level $level: ${compressed.length} bytes');
}
}
我们测试从 1(最快)到 9(最佳压缩)的压缩级别。较高的级别通常会产生较小的输出,但压缩需要更多时间。
$ dart main.dart Level 1: 63 bytes Level 2: 57 bytes Level 3: 56 bytes Level 4: 55 bytes Level 5: 55 bytes Level 6: 55 bytes Level 7: 55 bytes Level 8: 55 bytes Level 9: 55 bytes
文件压缩
此示例展示了文件的压缩和解压缩。
main.dart
import 'dart:io';
import 'dart:convert';
Future<void> main() async {
final codec = ZLibCodec();
final file = File('example.txt');
// Compress file
final original = await file.readAsBytes();
final compressed = codec.encode(original);
await File('example.z').writeAsBytes(compressed);
// Decompress file
final compressedFile = await File('example.z').readAsBytes();
final decompressed = codec.decode(compressedFile);
await File('example_decompressed.txt').writeAsBytes(decompressed);
print('Original: ${original.length} bytes');
print('Compressed: ${compressed.length} bytes');
}
我们读取一个文件,压缩其内容,然后保存压缩版本。接着,我们将其解压缩以验证过程。这展示了实际的文件压缩用法。
$ dart main.dart Original: 1024 bytes Compressed: 512 bytes
流式压缩
此示例演示了大型数据的流式压缩。
main.dart
import 'dart:io';
import 'dart:convert';
Future<void> main() async {
final codec = ZLibCodec();
final input = File('large_file.txt').openRead();
final output = File('compressed.z').openWrite();
// Compress stream
await input.transform(codec.encoder).pipe(output);
// Decompress stream
final compressed = File('compressed.z').openRead();
final decompressed = File('decompressed.txt').openWrite();
await compressed.transform(codec.decoder).pipe(decompressed);
print('Stream compression completed');
}
我们使用流来处理大文件,而无需将所有内容加载到内存中。transform 方法分块处理数据,使其具有内存效率。
$ dart main.dart Stream compression completed
自定义字典
此示例展示了使用自定义字典进行压缩。
main.dart
import 'dart:convert';
void main() {
final dictionary = utf8.encode('commonprefix');
final codec = ZLibCodec(dictionary: dictionary);
final text1 = 'commonprefix12345';
final text2 = 'commonprefix67890';
final compressed1 = codec.encode(utf8.encode(text1));
final compressed2 = codec.encode(utf8.encode(text2));
print('Text1 compressed: ${compressed1.length} bytes');
print('Text2 compressed: ${compressed2.length} bytes');
final decompressed1 = utf8.decode(codec.decode(compressed1));
final decompressed2 = utf8.decode(codec.decode(compressed2));
print('Decompressed1: $decompressed1');
print('Decompressed2: $decompressed2');
}
自定义字典可以提高具有共同前缀的数据的压缩效率。编码器和解码器必须使用相同的字典才能正确运行。
$ dart main.dart Text1 compressed: 22 bytes Text2 compressed: 22 bytes Decompressed1: commonprefix12345 Decompressed2: commonprefix67890
最佳实践
- 级别选择:根据需求选择压缩级别
- 内存使用:大数据的流式处理
- 错误处理:处理 ZLibError 异常
- 字典:用于具有共同前缀的数据
- 重用:尽可能重用编解码器实例
来源
本教程介绍了 Dart 的 ZLibCodec 类,并通过实际示例展示了基本用法、文件操作、流式处理以及字典等高级功能。
作者
列出 所有 Dart 教程。