将 u8 的可变缓冲区放入 BufReader.read() 中

Put a mutable buffer of u8 into BufReader.read()

提问人:mike rodent 提问时间:9/9/2023 最后编辑:mike rodent 更新时间:9/9/2023 访问量:41

问:

继续对我的问题的部分回答

我基本上是在试图理解一种特定的表现形式是如何工作的,这不是.BufReaderstd::io::BufReader

令人费解的是,() 产生了一个被称为 type 的对象。显然,这与 不同,这大概解释了为什么它不实现 trait,因此该方法不可用。std::io::BufReader::new(pipe.clone())std::io::buffered::bufreader::BufReader<ipipe::pipe_windows::Pipe>std::io::BufReaderstd::io::BufReadlines

我找不到有关该模块的任何文档。但我认为它似乎实现了特征,因此是一种方法。我假设在这种情况下,这是一种阻塞方法,即它会等到一些数据进入管道(请参阅 std::io::Reader::read 的详细信息)。std::io::buffered::bufreaderBufReaderReadread

但是我无法弄清楚如何提交编译器将接受此方法的 u8 数组:这些是我的一些不成功的尝试:

    let br = BufReader::new(pipe.clone());
    let buf = br.buffer();
    println!("buf {:?}", buf);
    // let mut v:[u8] = Vec::new();
    // let mut receiving_buf: [u8] = [0 as u8; 1000];
    // let mut receiving_buf = vec![0; 24];
    let mut receiving_buf = [0; 24];
    buf.read(&mut receiving_buf);

...我不在乎它是在堆上还是在堆栈上......我只想让这个东西工作。

的 NB 消息签名是 。std::io::Reader::readfn read(&mut self, buf: &mut [u8]) -> Result<usize>

数组 Rust IO BufferedReader

评论

0赞 Ivan C 9/9/2023
std::io::BufReader是 的再导出。方法通过 trait BufReader 提供。你有它的范围吗?std::io::buffered::bufreader::BufReadelines
0赞 mike rodent 9/9/2023
是的,在文件的顶部!use std::io::{Read, BufReader};
0赞 mike rodent 9/9/2023
啊,但是(特征)不在范围内。在我把它纳入范围后,事情就奏效了......谢谢!std::io::BufRead
0赞 mike rodent 9/9/2023
我投票结束这个问题,因为它源于 Rust 语言的幼稚

答:

2赞 Masklinn 9/9/2023 #1

令人费解的是 (std::io::) BufReader::new(pipe.clone()) 生成一个对象,据说该对象类型为 std::io::buffered::bufreader::BufReaderipipe::p ipe_windows::P ipe。显然,这与 std::io::BufReader 不同

是的。这只是内部名称,然后重新导出为 .std::io::BufRead

定义如下

这是它重新导出到 std::io::buffered 的位置

这是重新导出到 std::io 的位置

这大概解释了为什么它没有实现 trait std::io::BufRead,因此方法行不可用。

不。编译器从字面上告诉你为什么原始代码中没有 lines 方法:

help: the following trait is implemented but not in scope; perhaps add a `use` for it:
     |
1    + use std::io::BufRead;

这些特征需要在范围内才能使其实现可见。虽然有些特征总是在范围内(那些在前奏中导出的特征),但 的情况并非如此。BufRead

但是我无法弄清楚如何提交编译器将接受此方法的 u8 数组:这些是我的一些不成功的尝试:

我不知道这意味着什么。 是内部数据缓冲区,它是放置它从包装中读取的数据的地方:缓冲读取器的重点是通过读取超过特别要求的多数据来“合并”读取,填充内部缓冲区,然后从那里产生内容,直到缓冲区为空。BufReader::bufferBufReaderRead

这是因为,假设你一次读取一个字节(例如,对于流式解析器),那么对每个字节执行 read() 系统调用是非常昂贵的。相反,它将执行比这更大的读取,然后产生一个字节,未来的单字节读取将从 bufreader 的内部缓冲区接收数据,直到它耗尽,这非常便宜(几乎只是一个边界检查)。BufReader

评论

0赞 mike rodent 9/9/2023
感谢您的全面解释。 位于文件顶部。由于您的回答和 Ivan C 的评论,我包括特征......然后事情就好了!use std::io::{Read, BufReader};BufRead