如何从流中读取特定数量的字节?

时间:2015-05-23 12:12:36

标签: rust

我有一个BufStream<T>的结构T: Read+WriteBufStream可以是TcpStream,我想从中读取n个字节。 在预定义的缓冲区中没有固定数量的字节,但是我有一个字符串/流,它指示下一个要读取的字节数。

有一个很好的方法吗?

2 个答案:

答案 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::takeRead::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)
    );
}