You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向非std::io::BufReader的read方法传入u8可变缓冲区?

问题解决思路

核心错误原因

你调用br.buffer()拿到的是BufReader内部缓冲区的不可变字节切片(&[u8]),它并不实现Read trait——Read是给可读数据源设计的,而&[u8]是只读的字节序列,只能作为读取的目标,不能作为读取源。另外read方法需要&mut self,你拿到的不可变引用也会导致编译错误。

修正后的代码

use std::io::Read;

// 必须将br声明为可变,因为read方法需要&mut self
let mut br = BufReader::new(pipe.clone());
let mut receiving_buf = [0; 24];

// 直接对BufReader实例调用read方法
match br.read(&mut receiving_buf) {
    Ok(n) => println!("读取了{}字节: {:?}", n, &receiving_buf[..n]),
    Err(e) => eprintln!("读取失败: {}", e),
}

额外优化:转换成标准库BufReader使用lines方法

如果这个自定义BufReader实现了Read trait,你可以把它包装成标准库的std::io::BufReader,这样就能使用lines等BufRead trait提供的方法:

use std::io::{BufRead, BufReader as StdBufReader};

let mut br = BufReader::new(pipe.clone());
let std_buf_reader = StdBufReader::new(br);

for line in std_buf_reader.lines() {
    match line {
        Ok(content) => println!("读取到一行: {}", content),
        Err(err) => eprintln!("读取行出错: {}", err),
    }
}

内容的提问来源于stack exchange,提问作者mike rodent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:13:10