提问人:mike rodent 提问时间:9/9/2023 最后编辑:mike rodent 更新时间:9/9/2023 访问量:41
将 u8 的可变缓冲区放入 BufReader.read() 中
Put a mutable buffer of u8 into BufReader.read()
问:
继续对我的问题的部分回答。
我基本上是在试图理解一种特定的表现形式是如何工作的,这不是.BufReader
std::io::BufReader
令人费解的是,() 产生了一个被称为 type 的对象。显然,这与 不同,这大概解释了为什么它不实现 trait,因此该方法不可用。std::io::
BufReader::new(pipe.clone())
std::io::buffered::bufreader::BufReader<ipipe::pipe_windows::Pipe>
std::io::BufReader
std::io::BufRead
lines
我找不到有关该模块的任何文档。但我认为它似乎实现了特征,因此是一种方法。我假设在这种情况下,这是一种阻塞方法,即它会等到一些数据进入管道(请参阅 std::io::Reader::read 的详细信息)。std::io::buffered::bufreader
BufReader
Read
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);
...我不在乎它是在堆上还是在堆栈上......我只想让这个东西工作。
的 NB 消息签名是 。std::io::Reader::read
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
答:
令人费解的是 (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
的位置
这大概解释了为什么它没有实现 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::buffer
BufReader
Read
这是因为,假设你一次读取一个字节(例如,对于流式解析器),那么对每个字节执行 read() 系统调用是非常昂贵的。相反,它将执行比这更大的读取,然后产生一个字节,未来的单字节读取将从 bufreader 的内部缓冲区接收数据,直到它耗尽,这非常便宜(几乎只是一个边界检查)。BufReader
评论
use std::io::{Read, BufReader};
BufRead
评论
std::io::BufReader
是 的再导出。方法通过 trait BufReader 提供。你有它的范围吗?std::io::buffered::bufreader::BufReade
lines
use std::io::{Read, BufReader};
std::io::BufRead