Rust 标准库 I/O

std::io 的 Read/Write/BufRead 抽象,错误类型,与文件/标准流的基本用法。

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust 标准库 I/O

这个概念为什么出现

程序要与字节流交互:stdin、文件、socket、内存缓冲。
std::io 用小 trait 统一读写,错误用 std::io::Error

[!abstract] 一句话理解 Read 填充字节缓冲,Write 写出字节,BufRead 提供按行等缓冲读;它们组合出文件与网络 I/O 的共同语言。

最小可运行示例

场景:CLI 工具把一行提示写到 stdout 并回显大写

运维小工具从 stdin 读一行用户输入,去空白后转大写写回。

use std::io::{self, BufRead, Write};

// 业务意图:交互式读取一行并规范化输出。
// 教学点:stdin lock + BufRead;Write::write_all;io::Result。

fn main() -> io::Result<()> {
    let stdout = io::stdout();
    let mut out = stdout.lock();
    out.write_all(b"input> ")?;
    out.flush()?;

    // 无交互环境时用 Cursor 演示同一 Read 抽象
    let demo = b"  cargo  \n";
    let mut cursor = io::Cursor::new(&demo[..]);
    let mut line = String::new();
    cursor.read_line(&mut line)?;
    let normalized = line.trim().to_uppercase();
    writeln!(out, "normalized={normalized}")?;
    Ok(())
}

建议运行:cargo run

期望输出包含:

input> normalized=CARGO

结合场景再看三个关注点

  1. ? 传播 io::Error
  2. Cursor 让测试不依赖真终端
  3. 缓冲读写减少系统调用

核心概念与准确模型

Trait作用
Readread(&mut self, buf) -> Result<usize>
Writewrite / flush
BufReadread_line / lines

std::fs::File 实现这些 trait。
部分读/写要循环直到完成(或用 read_exact/write_all)。

设计动机

  • 组合优于为每种介质写死 API
  • 错误统一
  • 同步 I/O 简单路径;async 另有生态

边界与误区

  • read 返回 0 常表示 EOF
  • 文本模式与换行平台差异
  • 阻塞 I/O 不适合直接当高并发服务器热路径

[!warning] 常见误区:忽略 write 的短写 使用 write_all 或循环写完。

工程实践

  1. 测试用 Cursor/临时文件
  2. 大文件用缓冲
  3. 明确二进制 vs 文本
  4. 错误带路径上下文

本节总结

  • Read/Write 统一字节流
  • BufRead 提升文本处理
  • 与文件系统笔记衔接

自测题

  1. read 返回 Ok(0) 通常意味着?
  2. 为什么需要 flush
参考答案
  1. EOF 或无更多数据。
  2. 缓冲可能尚未推到下游。

延伸阅读与资料来源

资料类型支撑内容
std::io标准库I/O 模块
The Book — I/O官方书CLI I/O 项目
创建于 2026/7/15 更新于 2026/7/15