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