45 个版本 (16 个重大更改)
0.17.0 | 2024 年 8 月 4 日 |
---|---|
0.17.0-beta.2 | 2024 年 7 月 23 日 |
0.17.0-beta.1 | 2024 年 6 月 4 日 |
0.16.7 | 2024 年 3 月 26 日 |
0.5.0 | 2022 年 11 月 8 日 |
在 压缩 中排名 #22
每月下载量 1,067 次
在 9 crates 中使用
73KB
806 行
OneIO - Rust 的一站式便捷 IO 库
OneIO 是一个 Rust 库,提供从不同来源和压缩格式中读取和写入数据文件的统一简单 IO 接口。
使用方法和功能标志
启用所有压缩算法并处理远程文件(默认)
oneio = "0.17"
从支持的功能标志中选择
oneio = { version = "0.17", default-features = false, features = ["remote", "gz"] }
默认标志包括 lib-core
和 rustls
。
核心功能: lib-core
lib-core
核心功能包括
remote
: 允许从远程文件读取,包括 http(s) 和 ftpcompressions
: 支持所有压缩算法gz
: 使用flate2
crate 支持gzip
文件bz
: 使用bzip2
crate 支持bzip2
文件lz
: 使用lz4
crate 支持lz4
文件xz
: 使用xz2
crate 支持xz
文件(需要安装 xz 库)zstd
: 使用zstd
crate 支持zst
文件
json
: 使用serde
和serde_json
允许将 JSON 内容读取到结构体中
TLS 选择: rustls
或 native-tls
用户可以选择 rustls
或 native-tls
作为他们的 TLS 库。我们使用 rustls
作为基本库。
用户还可以通过设置环境变量 ONEIO_ACCEPT_INVALID_CERTS=true
来选择接受无效证书(不推荐)。
可选功能: cli
, s3
, digest
s3
: 允许从 AWS S3 兼容的存储桶中读取cli
:构建命令行程序oneio
,使用以下功能lib-core
、rustls
、s3
用于核心功能clap
、tracing
用于 CLI 基础
digest
用于生成 SHA256 摘要字符串
选择一些压缩算法
用户还可以手动选择特定的压缩算法。例如,仅使用本地的 gzip
和 bzip2
文件
oneio = { version = "0.17", default-features = false, features = ["gz", "bz"] }
使用 oneio
命令行工具
OneIO 包含一个命令行工具 oneio
,该工具可以将本地/远程文件打开并读取到终端,并自动处理解压缩。如果您想从本地或远程源读取一些压缩的纯文本文件,这可能很有用。
oneio reads files from local or remote locations with any compression
Usage: oneio [OPTIONS] [FILE] [COMMAND]
Commands:
s3 S3-related subcommands
digest Generate SHA256 digest
help Print this message or the help of the given subcommand(s)
Arguments:
[FILE] file to open, remote or local
Options:
-d, --download download the file to current directory, similar to run `wget`
-o, --outfile <OUTFILE> output file path
--cache-dir <CACHE_DIR> cache reading to specified directory
--cache-force force re-caching if local cache already exists
--cache-file <CACHE_FILE> specify cache file name
-s, --stats read through the file and only print out stats
-h, --help Print help
-V, --version Print version
您可以在 oneio
后指定数据文件位置。以下命令打印出来自 https://bgpkit.com 的原始 HTML 文件。
oneio https://bgpkit.com
这是使用 oneio
读取远程压缩 JSON 文件、将其传递到 jq
并计算数组中 JSON 对象数量的另一个示例。
$ oneio https://data.bgpkit.com/peer-stats/as2rel-latest.json.bz2 | jq '.|length'
802861
您还可以使用 --download
(或 -d
)标志直接下载文件。
$ oneio -d https://archive.routeviews.org/route-views.amsix/bgpdata/2022.11/RIBS/rib.20221107.0400.bz2
file successfully downloaded to rib.20221107.0400.bz2
$ ls -lh rib.20221107.0400.bz2
-rw-r--r-- 1 mingwei staff 122M Nov 7 16:17 rib.20221107.0400.bz2
$ monocle parse rib.20221107.0400.bz2 |head -n5
A|1667793600|185.1.167.24|3214|0.0.0.0/0|3214 1299|IGP|185.1.167.24|0|0|3214:3001|NAG||
A|1667793600|80.249.211.155|61955|0.0.0.0/0|61955 50629|IGP|80.249.211.155|0|0||NAG||
A|1667793600|80.249.213.223|267613|0.0.0.0/0|267613 1299|IGP|80.249.213.223|0|0|5469:6000|NAG||
A|1667793600|185.1.167.62|212483|1.0.0.0/24|212483 13335|IGP|152.89.170.244|0|0|13335:10028 13335:19000 13335:20050 13335:20500 13335:20530 lg:212483:1:104|NAG|13335|108.162.243.9
A|1667793600|80.249.210.28|39120|1.0.0.0/24|39120 13335|IGP|80.249.210.28|0|0|13335:10020 13335:19020 13335:20050 13335:20500 13335:20530|AG|13335|141.101.65.254
将 OneIO 读取器作为库使用
返回的读取器实现了 BufRead,并处理以下类型的解压缩
gzip
:以gz
或gzip
结尾的文件bzip2
:以bz
或bz2
结尾的文件lz4
:以lz4
或lz
结尾的文件xz
:以xz
或xz2
结尾的文件zstd
:以zst
或zstd
结尾的文件
它还可以透明地读取远程或本地文件。
示例
全部读取到字符串中
const TEST_TEXT: &str = "OneIO test file.
This is a test.";
let mut reader = oneio::get_reader("https://spaces.bgpkit.org/oneio/test_data.txt.gz").unwrap();
let mut text = "".to_string();
reader.read_to_string(&mut text).unwrap();
assert_eq!(text.as_str(), TEST_TEXT);
按行读取
use std::io::BufRead;
const TEST_TEXT: &str = "OneIO test file.
This is a test.";
let lines = oneio::read_lines("https://spaces.bgpkit.org/oneio/test_data.txt.gz").unwrap()
.map(|line| line.unwrap()).collect::<Vec<String>>();
assert_eq!(lines.len(), 2);
assert_eq!(lines[0].as_str(), "OneIO test file.");
assert_eq!(lines[1].as_str(), "This is a test.");
将 OneIO 写入器作为库使用
[get_writer] 返回一个泛型写入器,实现了 [Write],并处理以下类型的解压缩
gzip
:以gz
或gzip
结尾的文件bzip2
:以bz
或bz2
结尾的文件
注意:目前不支持 lz4 写入器。
示例
常见 IO 操作
let to_read_file = "https://spaces.bgpkit.org/oneio/test_data.txt.gz";
let to_write_file = "/tmp/test_write.txt.bz2";
// read text from remote gzip file
let mut text = "".to_string();
oneio::get_reader(to_read_file).unwrap().read_to_string(&mut text).unwrap();
// write the same text to a local bz2 file
let mut writer = oneio::get_writer(to_write_file).unwrap();
writer.write_all(text.as_ref()).unwrap();
drop(writer);
// read from the newly generated bz2 file
let mut new_text = "".to_string();
oneio::get_reader(to_write_file).unwrap().read_to_string(&mut new_text).unwrap();
// compare the decompressed content of the remote and local files
assert_eq!(text.as_str(), new_text.as_str());
std::fs::remove_file(to_write_file).unwrap();
使用自定义头读取远程内容
use std::collections::HashMap;
use reqwest::header::HeaderMap;
let headers: HeaderMap = (&HashMap::from([("X-Custom-Auth-Key".to_string(), "TOKEN".to_string())]))
.try_into().expect("invalid headers");
let client = reqwest::blocking::Client::builder()
.default_headers(headers)
.danger_accept_invalid_certs(true)
.build().unwrap();
let mut reader = oneio::get_http_reader(
"https://SOME_REMOTE_RESOURCE_PROTECTED_BY_ACCESS_TOKEN",
Some(client),
).unwrap();
let mut text = "".to_string();
reader.read_to_string(&mut text).unwrap();
println!("{}", text);
将远程文件下载到本地目录
oneio::download(
"https://data.ris.ripe.net/rrc18/2022.11/updates.20221107.2325.gz",
"updates.gz",
None
).unwrap();
S3 相关操作(需要 s3
功能标志)
use oneio::s3::*;
// upload to S3
s3_upload("oneio-test", "test/README.md", "README.md").unwrap();
// read directly from S3
let mut content = String::new();
s3_reader("oneio-test", "test/README.md")
.unwrap()
.read_to_string(&mut content)
.unwrap();
println!("{}", content);
// download from S3
s3_download("oneio-test", "test/README.md", "test/README-2.md").unwrap();
// get S3 file stats
let res = s3_stats("oneio-test", "test/README.md").unwrap();
dbg!(res);
// error if file does not exist
let res = s3_stats("oneio-test", "test/README___NON_EXISTS.md");
assert!(res.is_err());
// copy S3 file to a different location
let res = s3_copy("oneio-test", "test/README.md", "test/README-temporary.md");
assert!(res.is_ok());
assert_eq!(
true,
s3_exists("oneio-test", "test/README-temporary.md").unwrap()
);
// delete temporary copied S3 file
let res = s3_delete("oneio-test", "test/README-temporary.md");
assert!(res.is_ok());
assert_eq!(
false,
s3_exists("oneio-test", "test/README-temporary.md").unwrap()
);
// list S3 files
let res = s3_list("oneio-test", "test/", Some("/".to_string()), false).unwrap();
assert_eq!(
false,
s3_exists("oneio-test", "test/README___NON_EXISTS.md").unwrap()
);
assert_eq!(true, s3_exists("oneio-test", "test/README.md").unwrap());
由 BGPKIT 团队用 ❤️ 构建
许可证
MIT
依赖
~0.3–18MB
~290K SLoC