rust - Rust 中有没有类似于 Go 中的 bufio.Reader.ReadSlice 的东西?

标签 rust

在 Go 中,bufio.Reader有一个方法 ReadSlice它读取直到分隔符并返回表示数据的切片。返回的切片本质上是内部缓冲区的 View 。因此,此过程中不涉及缓冲区的复制,尽管它不能执行诸如读取长于内部缓冲区大小的行之类的操作。

在 Rust 标准库或任何第三方 crate 中是否有类似的东西(阅读直到分隔符而不复制)?

最佳答案

read_until :
将所有字节读入 buf 直到达到分隔符字节或 EOF。

此函数将从底层流中读取字节,直到找到分隔符或 EOF。一旦找到,直到并包括分隔符(如果找到)的所有字节都将附加到 buf。

如果成功,此函数将返回读取的总字节数。

Rust 中的示例:

fn main() {
    use std::io::{self, BufRead};
    let mut cursor = io::Cursor::new(b"a-b-c");
    let mut buf = vec![];
    let num_bytes = cursor
        .read_until(b'-', &mut buf)
        .expect("reading from cursor won't fail");
    println!("{}", num_bytes); // 2
    println!("{:?}", buf); // [97, 45]
    let s = String::from_utf8(buf).expect("Invalid UTF-8");
    println!("{}", s); // a-
}

Go中的示例:

package main

import (
    "bufio"
    "fmt"
    "log"
    "strings"
)

func main() {
    s := `a-b-c`
    r := strings.NewReader(s)    // type Reader interface { Read(p []byte) (n int, err error) }
    br := bufio.NewReader(r)     // NewReaderSize(4096)
    bs, err := br.ReadSlice('-') // reads to the internal buffer
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(bs)         // [97 45]
    fmt.Println(string(bs)) //a-
}

关于rust - Rust 中有没有类似于 Go 中的 bufio.Reader.ReadSlice 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60581128/

相关文章:

multithreading - 在 Rust 中,如何创建在其自己的操作系统线程中运行的任务?

rust - 使用同一结构的另一个字段初始化结构的字段

asynchronous - rust-tokio 流中的缓冲区有没有办法使用 &[u8] 以外的东西?

rust - 在 Rust 中,Clone 是在堆上复制,而 Copy 是在堆栈上复制吗?

rust - 如何使用 Arc<Mutex<MyStruct<T>>> 在线程之间共享通用结构?

rust - 即使声明为可变的,变量也被认为是不可变的

rust - 为什么我不能尝试!互斥锁?

file - 过滤使用 fs::read_dir() 发现的文件或目录

rust - 为什么没有为明确实现的类型实现特征?

string - 如何对一片字节求和以减少溢出的可能性