Dart GZipCodec
最后修改于 2025 年 4 月 4 日
Dart 中的 GZipCodec 类提供了 GZIP 压缩和解压缩功能。它是 Dart dart:io 和 dart:convert 库的一部分,用于高效的数据处理。
GZipCodec 实现了 Codec 接口,允许进行编码(压缩)和解码(解压缩)操作。它对于减小数据大小以进行存储或传输非常有用。
基本定义
GZipCodec 是一种实现 GZIP 格式的压缩编解码器。它使用 DEFLATE 算法压缩字节数组或流。
主要功能包括可配置的压缩级别、流支持以及与标准 GZIP 文件格式的兼容性。它为压缩数据添加了适当的头和尾。
基本压缩示例
此示例展示了使用 GZipCodec 进行的基本字符串压缩。
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.
文件压缩
此示例演示了文件的压缩和解压缩。
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
自定义压缩级别
此示例展示了如何使用不同的压缩级别。
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
流式压缩
此示例演示了大型数据的流式压缩。
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 响应中的使用。
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
最佳实践
- 级别选择:根据需要选择压缩级别
- 流:对大型数据使用流式处理以节省内存
- 二进制数据:GZIP 对可压缩数据效果最佳
- HTTP:为 Web 响应启用压缩
- 错误处理:始终处理解压缩错误
来源
本教程通过实际示例涵盖了 Dart 的 GZipCodec 类,展示了基本用法、文件操作、流式处理和 HTTP 集成。
作者
列出 所有 Dart 教程。