当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。