我有一個結構與BufStream<T>
其中T: Read+Write
。 BufStream
可以是TcpStream
,我想從中讀取n個字節。 在預定義的緩衝區中不是固定數量的字節,但是我有一個字符串/流,指示接下來要讀取的字節數。如何從流中讀取特定數量的字節?
有沒有一個很好的方法來做到這一點?
我有一個結構與BufStream<T>
其中T: Read+Write
。 BufStream
可以是TcpStream
,我想從中讀取n個字節。 在預定義的緩衝區中不是固定數量的字節,但是我有一個字符串/流,指示接下來要讀取的字節數。如何從流中讀取特定數量的字節?
有沒有一個很好的方法來做到這一點?
這聽起來像你想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)
);
}
由於鏽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社區爲我指出了這個解決方案。
謝謝..不採取()消耗讀者? 我的用例是,我有一個tcpstream(結構的一部分),我從中讀取行。有時候,我不需要讀取一行,而是讀取特定數量的字節。之後,我需要再讀一遍...... – buster
它的確如此,但「讀者」可以是一個'&mut R',即對另一個讀者的臨時可變引用。 Take使用按值API,以便支持所有用例。這個模型出現在鏽蝕的一些不同角落。 – bluss
@buster as bluss指出,'&mut R'也實現了'Read'特性。我的例子使用它來達到良好的效果 - 這就是爲什麼我在例子的主要方法中傳入'&mut reader'。 – Shepmaster