10 个稳定版本
2.5.0 | 2024年1月5日 |
---|---|
2.4.0 | 2022年4月4日 |
2.2.2 | 2019年1月10日 |
1.0.1 | 2018年12月14日 |
#131 in 解析器实现
3,308 个月下载量
在 14 个crate中(11个直接使用)
17KB
229 行
bytelines
此库提供了一种简单的方法,可以以字节切片的形式读取输入行以提高效率。它基本上是标准库中的 lines,但它将每一行读取为字节切片(&[u8]
)。在这种情况下,如果不特别关心 Unicode,则此方法比 lines()
的性能要好得多,基本上与手动编写循环的速度相当。虽然代码本身相当简单,但我最近在至少 4 个工具中使用了这个功能,因此我认为是时候为此创建一个便利的 crate 了。
安装
此工具将通过 Crates.io 提供,因此您可以在您的 Cargo.toml
中将其添加为依赖项
[dependencies]
bytelines = "2.5"
使用方法
使用方法非常简单;在您通常会调用 lines
的 BufRead
实现,现在可以使用 bytelines
获取一个用于遍历行作为 &[u8]
(从而避免分配)的结构。有三种使用 API 的方法,如下所示
// our input file we're going to walk over lines of, and our reader
let file = File::open("./my-input.txt").expect("able to open file");
let reader = BufReader::new(file);
let mut lines = ByteLines::new(reader);
// Option 1: Walk using a `while` loop.
//
// This is the most performant option, as it avoids an allocation by
// simply referencing bytes inside the reading structure. This means
// that there's no copying at all, until the developer chooses to.
while let Some(line) = lines.next() {
// do something with the line
}
// Option 2: Use the `Iterator` trait.
//
// This is more idiomatic, but requires allocating each line into
// an owned `Vec` to avoid potential memory safety issues. Although
// there is an allocation here, the overhead should be negligible
// except in cases where performance is paramount.
for line in lines.into_iter() {
// do something with the line
}
截至 v2.3,此 crate 包含对 Tokio 的相对有限的支持,即 AsyncBufRead
特性。它与基本 API 非常相似,可以使用类似的方式使用。
// configure our inputs again, using `AsyncByteLines`.
let file = File::open("./my-input.txt").await?;
let reader = BufReader::new(file);
let mut lines = AsyncByteLines::new(reader);
// walk through all lines using a `while` loop
while let Some(line) = lines.next().await? {
// do something with the line
}
// walk through all lines using `Stream` APIs
lines.into_stream().for_each(|line| {
});
主要区别在于,Tokio实现产生的是Result<Option<&[u8]>, _>
,而不是为了与现有的Tokio API保持一致Option<Result<&[u8], _>>
。如果您不想使用Tokio支持,请禁用默认功能
[dependencies]
bytelines = { version = "2.5", default-features = false }
这将在下一个主要版本升级(v3.0)中作为默认功能被删除,但到目前为止,您可以通过这种方式排除它。
依赖项
~2.1–3.5MB
~52K SLoC