Rust I/O 操作

简介

这个教程将会深入探讨 Rust 中的输入/输出(I/O)操作。我们将从基础知识开始,逐步深入到更高级的主题。本教程旨在帮助读者理解如何在 Rust 中处理文件、网络和其他 I/O 相关任务。

目标受众

本教程面向有一定编程经验,对学习 Rust 感兴趣的人士。基本了解 Rust 语言并熟悉其基础语法和特性将会非常有帮助。

环境准备

  • Rust 编程语言的最新稳定版本,可以从 Rust 官方网站下载和安装。
  • 文本编辑器或集成开发环境(IDE),例如 Visual Studio Code、Sublime Text 或 IntelliJ Rust。

基础知识:输入/输出是什么?

在计算机科学中,输入/输出(I/O)是指程序与外部设备或系统之间的数据传递过程。这些外部设备可以包括键盘、鼠标、显示器、硬盘驱动器、网络套接字等。在 Rust 中,标准库提供了丰富的 I/O 功能,使得开发者可以轻松地处理这些任务。

文件 I/O

打开文件

要在 Rust 中打开一个文件,我们可以使用 std::fs::File 结构体的 open 函数:

use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;

fn main() {
    let path = Path::new("example.txt");
    let display = path.display();

    // 打开文件
    let file = match File::open(&path) {
        Err(why) => panic!("无法打开 {}: {}", display, why),
        Ok(file) => file,
    };
}

读取文件

为了从文件中读取数据,我们可以使用 BufRead trait 提供的 lines 函数:

use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;

fn main() {
    // ...打开文件代码...

    let file = File::open(&path).unwrap();
    for line in io::BufReader::new(file).lines() {
        if let Ok(ip) = line {
            println!("{}", ip);
        }
    }
}

写入文件

要向文件中写入数据,我们可以使用 std::io::Write trait 的 write_all 函数:

use std::fs::File;
use std::io::{self, Write};

fn main() {
    let mut file = File::create("output.txt").expect("创建文件失败");
    file.write_all(b"Hello, world!").expect("写入文件失败");
}

网络 I/O

TCP 客户端和服务器

Rust 标准库提供了 std::net 模块,用于处理网络相关任务。我们可以使用它来创建 TCP 客户端和服务器:

// TCP 服务器
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::thread;

fn handle_client(mut stream: TcpStream) {
    // ...处理客户端请求...
}

fn main() -> io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                thread::spawn(move || handle_client(stream));
            }
            Err(e) => println!("error: {}", e),
        }
    }
    Ok(())
}
// TCP 客户端
use std::io::{Read, Write};
use std::net::TcpStream;

fn main() -> io::Result<()> {
    let mut stream = TcpStream::connect("127.0.0.1:8080")?;
    stream.write_all(b"Hello, world!")?;
    Ok(())
}

结论

本教程介绍了 Rust 中的基础 I/O 操作,包括文件和网络相关任务。希望读者能够在实践中运用这些知识,并继续学习更高级的主题。