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 压缩
每月102次下载
62KB
1K SLoC
compress_io
读取和写入压缩文件/流的便利库
compress_io的目标是使应用支持多种压缩格式变得简单,既不需要开发者付出太多努力,也不需要用户付出太多努力(即应用可以接受不同格式的压缩或未压缩输入,开发者和用户都不需要指定使用了哪些格式)。
compress_io本身不提供压缩/解压缩功能,而是使用外部工具,如gzip、bzip2或zstd作为读取或写入过滤器。
lib.rs
:
读取和写入压缩文件/流的便利库
compress_io不提供压缩/解压缩功能,而是使用外部工具,如[gzip]、[bzip2]或[zstd]作为读取或写入过滤器。其目标是使应用支持多种压缩格式变得简单,既不需要开发者付出太多努力,也不需要用户付出太多努力(即应用可以接受不同格式的压缩或未压缩输入,开发者和用户都不需要指定使用了哪些格式)。
概述
使用 compress_io
的主要方法是通过 CompressIo
(或者在 async
代码的情况下,使用 AsyncCompressIo
)。可以生成一个读取器(实现 Read
),带缓冲的读取器(实现 BufRead
),写入器或带缓冲的写入器(两者都实现 Write
)。默认情况下,读取器和写入器使用 stdin
和 stdout
,但也可以使用 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