本文簡要介紹rust語言中 std::io::Read.read
的用法。
用法
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
將此源中的一些字節拉入指定的緩衝區,返回讀取了多少字節。
這個函數不提供任何關於它是否阻塞等待數據的保證,但是如果一個對象需要阻塞讀取並且不能,它通常會通過 Err
返回值來發出信號。
如果此方法的返回值為 Ok(n)
,則實現必須保證 0 <= n <= buf.len()
。非零 n
值表示緩衝區 buf
已被來自該源的 n
字節數據填充。如果 n
是 0
,則它可以指示以下兩種情況之一:
- 該讀取器已達到“end of file”,可能無法再生成字節。請注意,這並不意味著讀者將總是不再能夠產生字節。例如,在 Linux 上,此方法將調用
recv
係統調用std::net::TcpStream,其中返回零表示連接已正確關閉。而對於std::fs::File,有可能到達文件末尾並得到零結果,但是如果將更多數據附加到文件中,則將來的調用read
將返回更多數據。 - 指定的緩衝區長度為 0 字節。
如果返回值 n
小於緩衝區大小,則不是錯誤,即使讀取器尚未位於流的末尾。例如,這可能是因為現在實際可用的字節數較少(例如,接近文件結尾)或因為 read() 被信號中斷。
由於這個 trait 可以安全地實現,調用者不能依賴 n <= buf.len()
來保證安全。當unsafe
函數用於訪問讀取字節時,需要格外小心。調用者必須確保即使 n > buf.len()
也不會出現未經檢查的越界訪問。
不對內容提供任何保證buf
當調用此函數時,實現不能依賴於內容的任何屬性buf
是真的。建議實施隻將數據寫入buf
而不是閱讀其內容。
然而相應地,調用者此方法不得對實現如何使用做出任何保證buf
。該特征可以安全地實現,因此應該寫入緩衝區的代碼也可能從緩衝區中讀取。您有責任確保buf
在調用之前初始化read
.調用read
帶有未初始化的buf
(通過獲得的那種std::mem::MaybeUninit) 不安全,並且可能導致未定義的行為。
錯誤
如果此函數遇到任何形式的 I/O 或其他錯誤,將返回錯誤變體。如果返回錯誤,則必須保證沒有讀取任何字節。
ErrorKind::Interrupted
類型的錯誤不是致命的,如果沒有其他事情可做,則應重試讀取操作。
例子
File
實現 Read
:
use std::io;
use std::io::prelude::*;
use std::fs::File;
fn main() -> io::Result<()> {
let mut f = File::open("foo.txt")?;
let mut buffer = [0; 10];
// read up to 10 bytes
let n = f.read(&mut buffer[..])?;
println!("The bytes: {:?}", &buffer[..n]);
Ok(())
}
相關用法
- Rust Read.read_to_string用法及代碼示例
- Rust Read.read_to_end用法及代碼示例
- Rust Read.read_exact用法及代碼示例
- Rust Read.by_ref用法及代碼示例
- Rust Read.chain用法及代碼示例
- Rust Read.bytes用法及代碼示例
- Rust Read.take用法及代碼示例
- Rust Read用法及代碼示例
- Rust Result.unwrap_or_else用法及代碼示例
- Rust RefCell.try_borrow_unguarded用法及代碼示例
- Rust Ref.map用法及代碼示例
- Rust RefMut.leak用法及代碼示例
- Rust Ref.filter_map用法及代碼示例
- Rust RefCell.replace_with用法及代碼示例
- Rust Receiver.recv用法及代碼示例
- Rust Result.as_deref_mut用法及代碼示例
- Rust Result.unwrap_or_default用法及代碼示例
- Rust Result.as_mut用法及代碼示例
- Rust Result.map_or用法及代碼示例
- Rust Result.err用法及代碼示例
- Rust Receiver.recv_timeout用法及代碼示例
- Rust Receiver.try_recv用法及代碼示例
- Rust Result用法及代碼示例
- Rust Result.is_err用法及代碼示例
- Rust Result.into_ok用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::io::Read.read。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。