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 解析器实现

Download history 1800/week @ 2024-03-14 1511/week @ 2024-03-21 945/week @ 2024-03-28 878/week @ 2024-04-04 1167/week @ 2024-04-11 876/week @ 2024-04-18 1402/week @ 2024-04-25 2086/week @ 2024-05-02 1181/week @ 2024-05-09 1316/week @ 2024-05-16 883/week @ 2024-05-23 859/week @ 2024-05-30 881/week @ 2024-06-06 826/week @ 2024-06-13 918/week @ 2024-06-20 542/week @ 2024-06-27

3,308 个月下载量
14 个crate中(11个直接使用)

MIT 许可证

17KB
229

bytelines

Build Status Crates.io

此库提供了一种简单的方法,可以以字节切片的形式读取输入行以提高效率。它基本上是标准库中的 lines,但它将每一行读取为字节切片(&[u8])。在这种情况下,如果不特别关心 Unicode,则此方法比 lines() 的性能要好得多,基本上与手动编写循环的速度相当。虽然代码本身相当简单,但我最近在至少 4 个工具中使用了这个功能,因此我认为是时候为此创建一个便利的 crate 了。

安装

此工具将通过 Crates.io 提供,因此您可以在您的 Cargo.toml 中将其添加为依赖项

[dependencies]
bytelines = "2.5"

使用方法

使用方法非常简单;在您通常会调用 linesBufRead 实现,现在可以使用 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