我有一个BufStream<T>
的结构T: Read+Write
。
BufStream
可以是TcpStream
,我想从中读取n个字节。
在预定义的缓冲区中没有固定数量的字节,但是我有一个字符串/流,它指示下一个要读取的字节数。
有一个很好的方法吗?
答案 0 :(得分:6)
自Rust 1.6起,Read::read_exact
可用于执行此操作。如果bytes_to_read
是您需要读取的字节数,可能在运行时确定,reader
是要读取的流:
let mut buf = vec![0u8; bytes_to_read];
reader.read_exact(&mut buf)?;
read_exact
文档中我不清楚的部分是目标缓冲区可以是动态分配的Vec
。
感谢Rust Gitter社区指导我找到这个解决方案。
答案 1 :(得分:4)
听起来你想要Read::take
和Read::read_to_end
:
use std::io::prelude::*;
use std::io::BufReader;
use std::str;
fn read_n<R>(reader: R, bytes_to_read: u64) -> Vec<u8>
where
R: Read,
{
let mut buf = vec![];
let mut chunk = reader.take(bytes_to_read);
// Do appropriate error handling for your situation
let n = chunk.read_to_end(&mut buf).expect("Didn't read enough");
assert_eq!(bytes_to_read as usize, n);
buf
}
fn main() {
let input_data = b"hello world";
let mut reader = BufReader::new(&input_data[..]);
let first = read_n(&mut reader, 5);
let _ = read_n(&mut reader, 1);
let second = read_n(&mut reader, 5);
println!(
"{:?}, {:?}",
str::from_utf8(&first),
str::from_utf8(&second)
);
}