#read #io #string #code-point #avoid

已删除 utf8-bufread

提供BufRead的read_line & lines的替代方案,它们不会在换行符处停止

1.0.0 2021年4月5日
0.1.5 2021年3月14日

#11 in #code-point

Apache-2.0

305KB
707

UTF-8缓冲读取器

这个crate提供了通过一个名为BufRead的特质从任何实现了该特质的数据类型中读取utf-8文本的函数,而不需要等待换行符分隔符。这些函数利用缓冲区,要么返回字符串(str),要么返回字符(char)。每个都有一个关联的迭代器,其中一些有一个类似于Map迭代器的等效物,避免了分配和克隆。

crates.io docs.rs build status

使用方法

在您的Cargo.toml中添加此crate作为依赖项

[dependencies]
utf8-bufread = "1.0.0"

使用此crate读取文件的简单方法可能如下所示

// Reader may be any type implementing io::BufRead
// We'll just use a cursor wrapping a slice for this example
let mut reader = Cursor::new("Löwe 老虎 Léopard");
loop { // Loop until EOF
    match reader.read_str() {
        Ok(s) => {
            if s.is_empty() {
                break; // EOF
            }
            // Do something with `s` ...
            print!("{}", s);
        }
        Err(e) => {
            // We should try again if we get interrupted
            if e.kind() != ErrorKind::Interrupted {
                break;
            }
        }
    }
}

读取任意长度的字符串切片

read_str函数返回从内部读取器读取的任意长度字符串切片(最多为读取器缓冲区容量),无需克隆数据,除非有效的码点在读取器缓冲区末尾被截断。其关联的迭代器可以通过调用str_iter获得,由于它涉及在每个迭代中克隆数据,因此还提供了str_map

读取码点

read_char函数返回从内部读取器读取的字符。其关联的迭代器可以通过调用char_iter获得。

迭代器类型

这个crate提供了一些结构体,用于以多种方式迭代内部读取器的数据

  • StrIterCodepointIter 在每次迭代时都会克隆数据,但使用 Rc 来检查返回的 String 缓冲区是否还被使用。如果没有,则重新使用以避免重新分配。
let mut reader = Cursor::new("Löwe 老虎 Léopard");
for s in reader.str_iter().filter_map(|r| r.ok()) {
    // Do something with s ...
    print!("{}", s);
}
  • StrMapCodepointMap 允许在不分配或复制的情况下读取数据,但之后无法将其传递给进一步的迭代器适配器。
let s = "Löwe 老虎 Léopard";
let mut reader = Cursor::new(s);
let count: usize = reader
    .str_map(|s| s.len())
    .filter_map(Result::ok)
    .sum();
println!("There is {} valid utf-8 bytes in {}", count, s);
  • CharIterStrIter 和其他类似,不同之处在于它依赖于实现了 Copychar,因此不需要缓冲区或 "Rc" 伎俩。
let s = "Löwe 老虎 Léopard";
let mut reader = Cursor::new(s);
let count = reader
    .char_iter()
    .filter_map(Result::ok)
    .filter(|c| c.is_lowercase())
    .count();
assert_eq!(count, 9);

所有这些迭代器都可能读取数据直到 EOF 或找到无效的码点。如果从内部读取器读取了有效码点,它们会 报告错误之前将它们返回。在遇到错误或 EOF 之后,它们总是返回 None(选项)。它们总是忽略任何 Interrupted 错误。

进行中

这个 crate 仍在进行中。其 API 的一部分可以被认为是稳定的

然而,一些功能仍被视为不稳定

  • Error 的行为,特别是关于其 kind 以及如何避免数据丢失(见 leftovers)。

还有一些特性需要添加

鉴于我并不是最有经验的开发者,你非常欢迎在此提交问题和推送请求 这里

许可

Utf8-BufRead 在 Apache License 2.0 的条款下分发,请参阅此存储库根目录中的 LICENSE 文件。

无运行时依赖