15个不稳定版本
0.8.2 | 2024年1月27日 |
---|---|
0.8.1 | 2023年1月8日 |
0.8.0 | 2022年8月14日 |
0.7.0 | 2022年5月2日 |
#32 在 压缩 中
2,505 每月下载量
用于 3 个crate(直接使用2个)
1.5MB
21K SLoC
Brotlic
Brotlic(或BrotliC)是围绕brotli的一个薄包装。
目录
要求
构建brotli需要C编译器。
用法
Brotlic提供了对所有压缩和解压缩API的Rust绑定。支持对BufRead
和Write
的即时压缩和解压缩,通过CompressorReader<R>
,CompressorWriter<W>
,DecompressorReader<R>
和DecompressorWriter<W>
。对于底层实例,请参阅BrotliEncoder
和BrotliDecoder
。这些可以通过BrotliEncoderOptions
和BrotliDecoderOptions
分别进行配置。
处理BufRead
DecompressorReader<R>
- 读取brotli压缩的输入流并对其进行解压缩。CompressorReader<R>
- 读取流并在读取的同时对其进行压缩。
处理Write
CompressorWriter<W>
- 将brotli压缩数据写入底层写入器。DecompressorWriter<W>
- 将brotli解压缩数据写入底层writer。
为了简化这个决策,下表概述了所有差异
输入 | 输出 | 包装 | |
---|---|---|---|
CompressorReader<R> |
未压缩 | 压缩 | BufRead |
DecompressorReader<R> |
压缩 | 未压缩 | BufRead |
CompressorWriter<W> |
未压缩 | 压缩 | 写入 |
DecompressorWriter<W> |
压缩 | 未压缩 | 写入 |
使用brotli压缩文件
use std::fs::File;
use std::io::{self, Write};
use brotlic::CompressorWriter;
let mut input = File::open("test.txt")?; // uncompressed text file
let mut output = File::create("test.brotli")?; // compressed text output file
let mut output_compressed = CompressorWriter::new(output);
output_compressed.write_all(b"test")?;
解压缩相同的文件
use std::fs::File;
use std::io::{self, BufReader, Read};
use brotlic::DecompressorReader;
let mut input = BufReader::new(File::open("test.brotli")?); // uncompressed text file
let mut input_decompressed = DecompressorReader::new(input); // requires BufRead
let mut text = String::new();
input_decompressed.read_to_string(&mut text)?;
assert_eq!(text, "test");
在内存中压缩和解压缩
use std::io::{self, Read, Write};
use brotlic::{CompressorWriter, DecompressorReader};
let input = vec![0; 1024];
// create a wrapper around Write that supports on the fly brotli compression.
let mut compressor = CompressorWriter::new(Vec::new()); // write to memory
compressor.write_all(input.as_slice());
let encoded_input = compressor.into_inner()?; // read to vec
// create a wrapper around BufRead that supports on the fly brotli decompression.
let mut decompressed_reader = DecompressorReader::new(encoded_input);
let mut decoded_input = Vec::new();
decompressed_reader.read_to_end(&mut decoded_input)?;
assert_eq!(input, decoded_input);
有时可以通过自定义压缩质量以换取更好的压缩比,从而在运行时成本和压缩比之间进行权衡
use brotlic::{BlockSize, BrotliEncoderOptions, CompressorWriter, Quality, WindowSize};
let encoder = BrotliEncoderOptions::new()
.quality(Quality::best())
.window_size(WindowSize::best())
.block_size(BlockSize::best())
.build()?;
let writer = Vec::new();
let compressed_writer = CompressorWriter::with_encoder(encoder, writer);
建议不要直接使用编码器,而是将其传递给更高级的抽象,如CompressorWriter<W>
或DecompressorReader<R>
。
性能
Brotlic的性能与rust-brotli库相当
要自行测试,请运行cargo bench
。这将使用不同大小和不同熵的输入来比较该库和rust brotli库的性能。
许可
根据您的要求,受以下任一协议许可
- Apache License, Version 2.0 (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则根据Apache-2.0许可中定义的,您提交的旨在包含在作品中并由您有意提交的任何贡献,将如上所述双重许可,而无需任何额外条款或条件。
致谢
- Aron Parker - 为编写此库crate
- Brotli C库 - 为底层的C库
- JetBrains - 为他们出色的工具(CLion)