ZetCode

Dart RawZLibFilter

最后修改于 2025 年 4 月 4 日

Dart 中的 RawZLibFilter 类提供了对 zlib 压缩和解压缩的底层访问。它是 Dart dart:io 库的一部分,处理原始 zlib 数据流。

与 ZLibCodec 不同,RawZLibFilter 在没有 zlib 头和尾的情况下工作。这使其适用于使用原始 zlib 流的特定协议。

基本定义

RawZLibFilter 是一个实现 zlib 压缩的转换器。它在没有 zlib 头的情况下处理字节流,提供原始压缩。

主要功能包括可配置的压缩级别、窗口位数和内存级别。它可用于字节流的压缩和解压缩。

基本压缩

本示例展示了使用 RawZLibFilter 进行的基本压缩。

main.dart
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 数据的基本解压缩。

main.dart
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 进行流式压缩。

main.dart
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

自定义压缩参数

本示例演示了自定义压缩参数。

main.dart
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

错误处理

本示例展示了解压缩过程中的错误处理。

main.dart
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

最佳实践

来源

Dart RawZLibFilter 文档

本教程介绍了 Dart 的 RawZLibFilter 类,并通过实际示例展示了原始 zlib 数据的压缩、解压缩、流式处理和错误处理。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程