當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Read.read用法及代碼示例


本文簡要介紹rust語言中 std::io::Read.read 的用法。

用法

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

將此源中的一些字節拉入指定的緩衝區,返回讀取了多少字節。

這個函數不提供任何關於它是否阻塞等待數據的保證,但是如果一個對象需要阻塞讀取並且不能,它通常會通過 Err 返回值來發出信號。

如果此方法的返回值為 Ok(n) ,則實現必須保證 0 <= n <= buf.len() 。非零 n 值表示緩衝區 buf 已被來自該源的 n 字節數據填充。如果 n0 ,則它可以指示以下兩種情況之一:

  1. 該讀取器已達到“end of file”,可能無法再生成字節。請注意,這並不意味著讀者將總是不再能夠產生字節。例如,在 Linux 上,此方法將調用recv係統調用std::net::TcpStream,其中返回零表示連接已正確關閉。而對於std::fs::File,有可能到達文件末尾並得到零結果,但是如果將更多數據附加到文件中,則將來的調用read將返回更多數據。
  2. 指定的緩衝區長度為 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-lang.org大神的英文原創作品 std::io::Read.read。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。