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