TranslateProject/published/20230102.0 ⭐️ How to read and write files in Rust.md
2023-01-14 16:45:15 +08:00

116 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "How to read and write files in Rust"
[#]: via: "https://opensource.com/article/23/1/read-write-files-rust"
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15442-1.html"
如何在 Rust 中读取和写入文件
======
> 跟随这个演示,学习如何在 Rust 中使用文件系统模块。
![][0]
知道如何读写文件对各种用途都很有用。在 Rust 中,这项任务是通过标准库中的文件系统模块([std::fs][1])完成的。在这篇文章中,我将向你介绍如何使用这个模块。
为了演示这项任务,我准备了一些示例代码,也可以在 [GitHub][2] 上找到。
### 准备工作
在使用 Rust 时,失败的函数会返回 [Result][3] 类型。尤其是文件系统模块会返回专门的类型 [std::io::Result<T, Error>][4]。有了这些知识,你可以从 `main()` 函数中返回相同的类型:
```
fn main() -> std::io::Result<()> {
/* ...code comes here... */
```
### Rust 文件写入
在 Rust 中执行文件的 I/O 操作是相对容易的。写入文件可以简化为一行:
```
use std::fs;
fs::write("favorite_websites.txt", b"opensource.com")?;
Ok(())
```
使用错误传播操作符 `(?)`,错误信息被传递到调用函数中,随后可以处理错误。由于 `main()` 是调用栈中唯一的其他函数,如果写操作失败,错误信息将被传递到控制台输出。
[fs::write][5] 函数的语法是非常先进的。第一个参数是文件路径,它必须是 [std::path::Path][6] 类型。第二个参数是内容,它实际上是一个字节切片(`[u8]`。Rust 将传递的参数转换为正确的类型。幸运的是,这些类型基本上是下面的例子中所处理的唯一类型。
使用文件描述符类型 [std::fs::File][7] 可以实现对写操作更简洁的访问:
```
let mut file = fs::File::create("favorite_websites.txt")?;
file.write_all(b"opensource.com\n")?;
Ok(())
```
由于文件类型实现了 [Write][8] 特性,所以可以使用相关的方法来写入文件。然而,`create` 方法可以覆盖一个已经存在的文件。
为了获得对文件描述符的更多控制,必须使用 [std::fs::OpenOptions][9] 类型。这提供了类似于其他语言中的打开模式:
```
let mut file = fs::OpenOptions::new()
.append(true)
.open("favorite_websites.txt")?;
file.write_all(b"sourceforge.net\n")?;
```
### Rust 文件读取
适用于写的东西也适用于读。读取也可以通过简单的一行代码来完成:
```
let websites = fs::read_to_string("favorite_websites.txt")?;
```
以上一行读取文件的内容并返回一个字符串。除了读取字符串,还有 [std::fs::read][10] 函数,如果文件包含二进制数据,该函数会将数据读成一个字节向量。
下一个例子显示了如何将文件的内容读入内存,随后逐行打印到控制台:
```
let file = fs::File::open("favorite_websites.txt")?;
let lines = io::BufReader::new(file).lines();
for line in lines {
if let Ok(_line) = line {
println!(">>> {}", _line);
}
}
```
### 总结
如果你已经熟悉了其他编程语言,你可能已经注意到没有 `close-` 函数(或类似的)来释放文件句柄。在 Rust 中,当相关变量超出作用域,文件句柄就会被释放。为了定义关闭行为,可以在文件表示的周围应用作用域 `({ })`。我建议你熟悉 [Read][11] 和 [Write][8] 特性,因为你可以在许多其他类型中找到这个特性的实现。
--------------------------------------------------------------------------------
via: https://opensource.com/article/23/1/read-write-files-rust
作者:[Stephan Avenwedde][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/hansic99
[b]: https://github.com/lkxed
[1]: https://doc.rust-lang.org/std/fs/
[2]: https://github.com/hANSIc99/rust_file_io
[3]: https://doc.rust-lang.org/std/result/enum.Result.html
[4]: https://doc.rust-lang.org/std/io/type.Result.html
[5]: https://doc.rust-lang.org/std/fs/fn.write.html
[6]: https://doc.rust-lang.org/std/path/struct.Path.html
[7]: https://doc.rust-lang.org/std/fs/struct.File.html
[8]: https://doc.rust-lang.org/std/io/trait.Write.html
[9]: https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#
[10]: https://doc.rust-lang.org/std/fs/fn.read.html
[11]: https://doc.rust-lang.org/std/io/trait.Read.html
[0]: https://opensource.com/sites/default/files/lead-images/rust_programming_crab_sea.png