从这个部分答案开始我的问题。
我基本上是想了解
BufReader
的特定表现是如何工作的,这不是 std::io::BufReader
。
令人费解的是 (
std::io::
) BufReader::new(pipe.clone())
产生了一个据说是 std::io::buffered::bufreader::BufReader<ipipe::pipe_windows::Pipe>
类型的对象。显然,这与 std::io::BufReader
不同,这大概解释了为什么它没有实现特征 std::io::BufRead
,因此方法 lines
不可用。
我找不到有关
std::io::buffered::bufreader
模块的任何文档。但我认为它的 BufReader
似乎实现了特质 Read
,因此是一种方法 read
。我假设在这种情况下这是一种阻塞方法,即它会等待一些数据从管道中流出(请参阅 std::io::Reader::read 的详细信息)。
但是我不知道如何提交编译器将接受此方法的 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);
...我不在乎它是在堆上还是在堆栈上...我只想让它工作。
std::io::Reader::read
的NB消息签名是fn read(&mut self, buf: &mut [u8]) -> Result<usize>
。
令人费解的是 (std::io::) BufReader::new(pipe.clone()) 生成一个据说是 std::io::buffered::bufreader::BufReaderipipe::pipe_windows 类型的对象::管道。显然这与 std::io::BufReader 不一样
是的。这只是内部名称,然后重新导出为
std::io::BufRead
。
std::io::buffered
std::io
这大概解释了为什么它没有实现特征 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;
但是我不知道如何提交编译器将接受此方法的 u8 数组:这些是我的一些不成功的尝试:
我不知道这意味着什么。
BufReader::buffer
是内部数据缓冲区,BufReader
放置从包装的 Read
读取的数据:缓冲读取器的要点是通过读取超过特定请求的数据来“合并”读取,填充内部缓冲区,然后从那里生成内容,直到缓冲区为空。
那是因为如果说您一次读取一个字节(例如对于流解析器),则为每个字节执行 read() 系统调用的成本非常高。
BufReader
将执行比这更大的读取,然后产生一个字节,并且未来的单字节读取将从 bufreader 的内部缓冲区接收数据,直到它耗尽,这是非常便宜的(几乎只是一个边界检查)。