如何向非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
相关产品推荐
相关产品推荐

