[译]Dart 压缩/解压库 archive

1,606 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情


archive | Dart Package (flutter-io.cn)

译时版本:3.3.1


archive

Dart CI pub package

概览

可编码解码各种存档和压缩格式的 Dart 库。

archive 库现在支持以下解码器:

  • Zip (存档)
  • Tar (存档)
  • ZLib [膨胀解压]
  • GZip [膨胀解压]
  • BZip2 [解压]
  • XZ [解压]

和以下的编码器:

  • Zip (存档)
  • Tar (存档)
  • ZLib [收缩压缩]
  • GZip [收缩压缩]
  • BZip2 [压缩]

用法

现在有两个版本的 Archive 库:

package:archive/archive.dart

  • 可用于 Web 应用,因为它不依赖 'dart:io' 。

package:archive/archive_io.dart

  • 可用于 Flutter 和服务器应用,可减少直接文件存取的内存使用。archive.dart 中的所有的类和函数都包含在 archive_io.dart

archive_io

archive_io 库包含存取文件系统的类和函数。这些类和函数可显著地减少直接解码存档到磁盘时的内存使用。

使用 InputFileStream 和 OutputFileStream 减少内存使用:

import 'package:archive/archive_io.dart';
// ...
  // 使用 InputFileStream 存取 zip 文件,不在内存中进行排序。
  final inputStream = InputFileStream('test.zip');
  // 从 InputFileStream 解压 zip 。该存档里有 zip 的内容,没有在内存中排序后的数据。
  final archive = ZipDecoder().decodeBuffer(inputStream);
  // 对于存档中的所有实体 
  for (var file in archive.files) {
    // 如果是文件,不是文件夹(目录)
    if (file.isFile) {
      // 将文件内容写入到名为 'out' 的目录中。
      // 实际上,你需要确保文件名(file.name)不包含 '..' 路径
      // 该路径会把文件放到解压的目录之外。
      // OutputFileStream 会将数据写到硬盘上。
      final outputStream = OutputFileStream('out/${file.name}');
      // writeContent 方法会直接解压文件内容,不会在内存中排序解压后的数据。
      file.writeContent(outputStream);
      // 确保关闭了输入流使文件关闭。
      outputStream.close();
    }
  }

extractFileToDisk

extractFileToDisk 是很方便的向输出目录解压存档文件目录的内容。存档类型由文件扩展名决定。

import 'package:archive/archive_io.dart';
// ...
extractFileToDisk('test.zip', 'out');

extractArchiveToDisk

extractArchiveToDisk 是很方便的向输出目录写入存档内容的函数。

import 'package:archive/archive_io.dart';
// ...
// 使用 InputFileStream 存取 zip 文件,不会在内存中进行排序。
final inputStream = InputFileStream('test.zip');
// 从 InputFileStream 解压 zip 。存档里有 zip 的内容,没有在内存中排序后的数据。
final archive = ZipDecoder().decodeBuffer(inputStream);
extractArchiveToDisk(archive, 'out');