Dart RawZLibFilter
最后修改于 2025 年 4 月 4 日
Dart 中的 RawZLibFilter
类提供了对 zlib 压缩和解压缩的底层访问。它是 Dart dart:io
库的一部分,处理原始 zlib 数据流。
与 ZLibCodec 不同,RawZLibFilter 在没有 zlib 头和尾的情况下工作。这使其适用于使用原始 zlib 流的特定协议。
基本定义
RawZLibFilter
是一个实现 zlib 压缩的转换器。它在没有 zlib 头的情况下处理字节流,提供原始压缩。
主要功能包括可配置的压缩级别、窗口位数和内存级别。它可用于字节流的压缩和解压缩。
基本压缩
本示例展示了使用 RawZLibFilter 进行的基本压缩。
import 'dart:io'; import 'dart:typed_data'; void main() { var data = Uint8List.fromList('Hello, world!'.codeUnits); var filter = RawZLibFilter(rawDeflate: true); var compressed = filter.process(data); print('Compressed: $compressed'); filter.finish(); }
我们创建一个 RawZLibFilter,并将 rawDeflate 设置为 true 以进行原始压缩。process() 方法在不带 zlib 头的情况下压缩输入数据。
$ dart main.dart Compressed: [202, 72, 205, 201, 201, 215, 81, 40, 207, 47, 202, 73, 1, 0]
基本解压缩
本示例演示了原始 zlib 数据的基本解压缩。
import 'dart:io'; import 'dart:typed_data'; void main() { var compressed = Uint8List.fromList([ 202, 72, 205, 201, 201, 215, 81, 40, 207, 47, 202, 73, 1, 0 ]); var filter = RawZLibFilter(rawInflate: true); var decompressed = filter.process(compressed); print('Decompressed: ${String.fromCharCodes(decompressed)}'); filter.finish(); }
我们创建一个 RawZLibFilter,并将 rawInflate 设置为 true 以进行原始解压缩。process() 方法将输入数据解压缩回原始形式。
$ dart main.dart Decompressed: Hello, world!
流式压缩
本示例展示了使用 RawZLibFilter 进行流式压缩。
import 'dart:io'; import 'dart:typed_data'; void main() async { var filter = RawZLibFilter(rawDeflate: true, level: 6); var chunks = [ Uint8List.fromList('First part '.codeUnits), Uint8List.fromList('Second part '.codeUnits), Uint8List.fromList('Third part'.codeUnits) ]; var compressed = Uint8List(0); for (var chunk in chunks) { compressed = Uint8List.fromList([...compressed, ...filter.process(chunk)]); } compressed = Uint8List.fromList([...compressed, ...filter.finish()]); print('Compressed length: ${compressed.length}'); }
我们将数据分块处理,并在调用之间维护压缩状态。finish() 方法会刷新过滤器中剩余的任何压缩数据。
$ dart main.dart Compressed length: 38
自定义压缩参数
本示例演示了自定义压缩参数。
import 'dart:io'; import 'dart:typed_data'; void main() { var data = Uint8List.fromList('Example data for compression'.codeUnits); var filter = RawZLibFilter( rawDeflate: true, level: 9, // Maximum compression windowBits: 15, // Default window size memLevel: 9, // Maximum memory usage strategy: ZLibStrategy.filtered ); var compressed = filter.process(data); print('Compressed size: ${compressed.length} bytes'); filter.finish(); }
我们使用最高级别、内存使用量和过滤策略配置压缩。这些参数会影响压缩比和性能特性。
$ dart main.dart Compressed size: 24 bytes
错误处理
本示例展示了解压缩过程中的错误处理。
import 'dart:io'; import 'dart:typed_data'; void main() { var invalidData = Uint8List.fromList([1, 2, 3, 4, 5]); try { var filter = RawZLibFilter(rawInflate: true); var result = filter.process(invalidData); filter.finish(); print('Decompressed: $result'); } on ZLibException catch (e) { print('Decompression failed: ${e.message}'); } }
我们尝试解压缩无效数据,并捕获发生的 ZLibException。在处理原始压缩数据时,正确的错误处理至关重要。
$ dart main.dart Decompression failed: Invalid data
最佳实践
- 资源清理:始终调用 finish() 来释放资源
- 错误处理:处理 ZLibException 以应对无效数据
- 分块:将大数据分块处理以管理内存
- 参数调整:根据您的用例调整参数
来源
本教程介绍了 Dart 的 RawZLibFilter 类,并通过实际示例展示了原始 zlib 数据的压缩、解压缩、流式处理和错误处理。
作者
列出 所有 Dart 教程。