持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
archive | Dart Package (flutter-io.cn)
译时版本:3.3.1
archive
概览
可编码解码各种存档和压缩格式的 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');