Rust:Read trait
1. Read trait简介
Read trait允许从源中读取字节。实现Read trait的类型被称为“读取器”。
Read
trait是一个在Rust中定义的特性,它允许从某个数据源中读取字节。实现了Read
trait的类型被称为“读取器”,它们可以使用Read
trait定义的方法来从数据源中读取数据。
例如,File
类型实现了Read
trait,因此我们可以使用File
类型的实例来从文件中读取数据。
pub trait Read {
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
...
}
2. read方法
读取器由一个必需的方法定义,即read()。每次调用read()都会尝试将字节从此源拉入提供的缓冲区。
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
例如,我们可以使用File
类型来实现Read
:
use std::io;
use std::io::prelude::*;
use std::fs::File;
fn main() -> io::Result<()> {
// 打开文件
let mut f = File::open("foo.txt")?;
// 创建一个长度为10的缓冲区
let mut buffer = [0; 10];
// 读取最多10个字节
f.read(&mut buffer)?;
Ok(())
}
3. 其他方法
许多其他方法都是基于read()实现的,这给了实现者许多读取字节的方式,而只需要实现一个方法。
例如,我们可以使用read_to_end
方法将整个文件读入缓冲区:
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 = Vec::new();
// 读取整个文件
f.read_to_end(&mut buffer)?;
Ok(())
}
4. 可组合性
读取器旨在彼此可组合。std::io中的许多实现者都接受并提供实现Read trait的类型。
例如,我们可以使用chain
方法将两个读取器链接在一起:
use std::io;
use std::io::prelude::*;
use std::fs::File;
fn main() -> io::Result<()> {
// 打开两个文件
let f1 = File::open("foo.txt")?;
let f2 = File::open("bar.txt")?;
// 将两个文件链接在一起
let mut handle = f1.chain(f2);
let mut buffer = String::new();
// 将两个文件都读入同一个缓冲区
handle.read_to_string(&mut buffer)?;
Ok(())
}
5. 效率
请注意,每次调用read()都可能涉及系统调用,因此,使用实现BufRead的东西(例如BufReader)将更加高效。
系统调用是指计算机程序请求操作系统内核提供服务的过程,它通常会带来一定的性能开销。
因此,如果我们需要频繁地调用read
方法来读取数据,那么使用实现了BufRead
trait的类型(例如BufReader
)将更加高效。这是因为BufRead
trait提供了一个内部缓冲区,可以减少系统调用的次数,从而提高读取数据的效率。
例如,我们可以使用BufReader
来按行读取文件:
use std::io::{self, BufRead};
use std::fs::File;
fn main() -> io::Result<()> {
// 打开文件
let file = File::open("foo.txt")?;
// 创建一个带缓冲区的读取器
let reader = io::BufReader::new(file);
// 按行读取文件
for line in reader.lines() {
println!("{}", line?);
}
Ok(())
}
当你需要从某个源读取字节时,你可能需要实现 Read
trait。例如,如果你正在编写一个从文件、套接字或其他类型的流中读取数据的程序,那么你可能需要实现 Read
trait 来从这些源中读取数据。Read
trait 的实现者只需要定义一个必需的方法 read()
,该方法负责从源中读取字节并将其放入提供的缓冲区中 。from刘金,转载请注明原文链接。感谢!
转载自:https://juejin.cn/post/7236287881324249143