use std::fs::File;
use std::io::{self, Read};
use tokio::fs::read_to_string;
async fn read_file_and_print(file_path: &str) -> Result<(), io::Error> {
match read_to_string(file_path).await {
Ok(content) => {
println!("{}", content);
Ok(())
},
Err(e) => {
eprintln!("Error reading file: {}", e);
Err(e)
}
}
}
错误处理策略
- 使用
Result
类型: 在read_file_and_print
函数的返回值类型中使用Result<(), io::Error>
,Ok(())
表示操作成功,Err(e)
包含具体的错误信息。这是Rust中处理错误的常用方式,使得错误处理代码结构清晰。
- 匹配错误并打印: 在
match
语句中,当读取文件操作出现错误时,使用eprintln!
将错误信息打印到标准错误输出,方便调试和排查问题,同时返回Err(e)
向上层调用者传递错误。
利用Tokio异步特性提高I/O效率
- 异步I/O操作: 使用
tokio::fs::read_to_string
,这是一个异步函数,它不会阻塞当前线程,而是将控制权交回给Tokio运行时,使得在文件I/O操作进行的同时,其他异步任务可以并行执行,充分利用系统资源,提高整体的I/O操作效率。
- 非阻塞运行时: Tokio运行时采用非阻塞的I/O模型,当
read_to_string
执行I/O操作时,它不会阻塞整个线程,而是注册一个I/O事件监听。当I/O操作完成时,运行时会重新调度相关任务继续执行,从而避免了线程在I/O等待时的空闲浪费,提升了系统的并发处理能力。