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 教程。