Có vẻ như bạn muốn Read::take
và 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)
);
}
Cảm ơn .. không dùng() tiêu thụ người đọc? Usecase của tôi là tôi có một tcpstream (một phần của một cấu trúc) mà từ đó tôi đọc dòng. Đôi khi ở giữa tôi không cần phải đọc một dòng nhưng một số tiền cụ thể của byte. Sau đó tôi sẽ cần phải đọc lại dòng ... – buster
Nó có, nhưng "người đọc" có thể là một '& mut R' tức là một tham chiếu tạm thời có thể thay đổi được với một trình đọc khác. Sử dụng API theo giá trị để tất cả các trường hợp sử dụng đều được hỗ trợ. Mô hình này xuất hiện ở một số góc rỉ sét khác nhau. – bluss
@buster như bluss chỉ ra, '& mut R' cũng thực hiện các đặc điểm' Read'. Ví dụ của tôi sử dụng điều đó để có hiệu quả tốt - đó là lý do tại sao tôi truyền vào '& mut reader' trong phương pháp chính của ví dụ. – Shepmaster