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

问题描述 投票:0回答:1

这个部分答案开始我的问题。

我基本上是想了解

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>

arrays rust io bufferedreader
1个回答
0
投票

令人费解的是 (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 的内部缓冲区接收数据,直到它耗尽,这是非常便宜的(几乎只是一个边界检查)。

© www.soinside.com 2019 - 2024. All rights reserved.