Size Read::take
ve Read::read_to_end
istedikleri gibi sesler:
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)
);
}
Teşekkürler ..() okuyucuyu tüketmiyor mu? Usecase, satırları okuduğum bir tcpstream (bir yapının parçası) var. Bazen aralarında bir satır okumam ve belirli bir bayt miktarına ihtiyacım yok. Daha sonra tekrar satırları okumam gerekecek ... – buster
Yapıyor, ama "okuyucu", başka bir okuyucunun geçici olarak değişebilen bir referansı olabilir. Take, tüm kullanım durumları desteklenecek şekilde bir by-value API kullanır. Bu model pasın bazı farklı köşelerinde görünür. – bluss
Buster'ın bluss olarak işaret ettiği gibi & mut R', 'Read 'özelliğini de uygular. Örneğim, bunun iyi bir etki yaratması için kullanıyor - bu yüzden örnekte ana yönteme '& mut okuyucu' iletiyorum. – Shepmaster