#read-write #reading #reader #write-file #path #user

compress_io

读取和写入压缩文件/流的便利库

4个版本 (2个重大更新)

0.5.0 2022年4月11日
0.4.0 2022年4月6日
0.2.1 2021年12月6日
0.2.0 2021年12月6日

#550 in 压缩

Download history 3/week @ 2024-04-19 2/week @ 2024-04-26 2/week @ 2024-05-31 2/week @ 2024-06-07 3/week @ 2024-06-21 9/week @ 2024-07-05 45/week @ 2024-07-12 18/week @ 2024-07-19 30/week @ 2024-07-26

每月102次下载

自定义许可协议

62KB
1K SLoC

compress_io

读取和写入压缩文件/流的便利库

compress_io的目标是使应用支持多种压缩格式变得简单,既不需要开发者付出太多努力,也不需要用户付出太多努力(即应用可以接受不同格式的压缩或未压缩输入,开发者和用户都不需要指定使用了哪些格式)。compress_io本身不提供压缩/解压缩功能,而是使用外部工具,如gzipbzip2zstd作为读取或写入过滤器。


lib.rs:

读取和写入压缩文件/流的便利库

compress_io不提供压缩/解压缩功能,而是使用外部工具,如[gzip]、[bzip2]或[zstd]作为读取或写入过滤器。其目标是使应用支持多种压缩格式变得简单,既不需要开发者付出太多努力,也不需要用户付出太多努力(即应用可以接受不同格式的压缩或未压缩输入,开发者和用户都不需要指定使用了哪些格式)。

概述

使用 compress_io 的主要方法是通过 CompressIo (或者在 async 代码的情况下,使用 AsyncCompressIo)。可以生成一个读取器(实现 Read),带缓冲的读取器(实现 BufRead),写入器或带缓冲的写入器(两者都实现 Write)。默认情况下,读取器和写入器使用 stdinstdout,但也可以使用 path 指定文件路径。默认情况下,compress_io 会根据文件的初始内容自动检测压缩输入文件的格式,并根据用户环境变量 $PATH 中是否存在选择适当的工具,以及根据文件扩展名确定输出文件的格式。这些自动方法可以通过 ctype 覆盖。如果可用,compress_io 将使用并行版本的压缩工具。默认情况下,压缩工具将使用默认的线程选项运行,但可以使用 cthreads 改变这种行为。

示例

use std::io::{self, BufRead, Write};
use compress_io::compress::CompressIo;

fn main() -> io::Result<()> {
  // Read from a (presumably) gzipped file foo.gz and write out to file `foo.xz` which will be
  // compressed using [xz] (assuming both [gzip] and [xz] are in the users Path.
  // In this example both read and write streams are buffered
  let mut reader = CompressIo::new().path("foo.gz").bufreader()?;
  let mut writer = CompressIo::new().path("foo.xz").bufwriter()?;
  for s in reader.lines().map(|l| l.expect("Read error")) {
    writeln!(writer, "{}", s)?
  }
  Ok(())
}

解压缩工具可以由用户指定,或者可以根据对输入文件前几个字节的分析自动选择。

use compress_io::{
  compress::CompressIo,
  compress_type::CompressType,
};

// Open a reader from `stdin`, using the first bytes from the file to determine whether the
// file is compressed or not
let mut rd1 = CompressIo::new().reader()?;
// Open a buffered reader from `foo.bz2` using [bzip2] to decompress
let mut rd2 = CompressIo::new().path("foo.bz2").ctype(CompressType::Bzip2).bufreader()?;

压缩工具也可以明确选择,或者可以自动根据文件名设置(例如,名为 test.zst 的文件将使用 zstd 工具进行压缩)。如果明确选择了压缩格式,则除非文件名中已存在扩展名,或者已选择 fix_path 选项,否则将添加扩展名到文件名。

use compress_io::{
  compress::CompressIo,
  compress_type::CompressType,
};

// Open a compressed writer to `stdout`, using [zstd] to compress the stream
let mut wrt1 = CompressIo::new().ctype(CompressType::Zstd).writer()?;
// Open a compressed buffered writer to the file `foo.lzma` using lzma to decompress
let mut wrt2 = CompressIo::new().path("foo").ctype(CompressType::Lzma).bufwriter()?;

一些可能的压缩格式可以由多个工具生成,这允许在标准工具不可用时使用其他工具。

例如,xz 压缩的标准工具是 xz 工具,但是 zstd 也可以执行 xz 压缩,如果 xz 不可用,库将使用它。注意,如果请求 bgzip 压缩,则仅使用 bgzip 工具;尽管 bgzip 压缩与 gzip 格式兼容,并且可以被任何处理 gzip 的压缩器解码,但在压缩过程中,bgzip 添加了其他工具不会生成的一些额外信息。

对于压缩,某些工具是线程化的。如果有多个工具可以执行给定的压缩类型,则优先选择线程化版本。例如,如果请求 gzip 压缩,并且当前 $PATH 中有 pigz 工具,则将使用它而不是 gzip。对于压缩,用户可以通过 cthreads 指定线程的偏好(如果可用)。

use compress_io::{
  compress::CompressIo,
  compress_type::{CompressType, CompressThreads},
};

// Open a compressed buffered writer to `foo.zstd`, using [zstd] to compress the stream
// using 4 threads
let mut wrt = CompressIo::new().ctype(CompressType::Zstd)
  .cthreads(CompressThreads::Set(4)).bufwriter()?;

用法

仅用于同步代码的用法,在您的 Cargo.toml 中将 compress_io 添加为依赖项,以从 crates.io 使用。

[dependencies ]
compress_io = "0.2"

用于异步代码时,应启用 async 功能

[dependencies ]
compress_io = { version = "0.2", features = ["async"] }

依赖项

~2–11MB
~125K SLoC