我在这里展示的函数本身都不恐慌,但我使用expect,因为我不知道哪种错误处理最适合您的应用程序。去阅读Rust编程语言关于错误处理的章节,了解如何在自己的程序中适当地处理失败。
Rust 1.26及以上版本
如果不想关心底层细节,可以使用一行函数进行读写。
将文件读入字符串
use std::fs;
fn main() {
let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
println!("{}", data);
}
读取Vec<u8>的文件
use std::fs;
fn main() {
let data = fs::read("/etc/hosts").expect("Unable to read file");
println!("{}", data.len());
}
写入文件
use std::fs;
fn main() {
let data = "Some data!";
fs::write("/tmp/foo", data).expect("Unable to write file");
}
Rust 1.0及以上版本
这些表单比为您分配String或Vec的单行函数稍微详细一些,但更强大的地方在于您可以重用分配的数据或附加到现有对象。
读取数据
读取文件需要两个核心部分:文件和读取。
将文件读入字符串
use std::fs::File;
use std::io::Read;
fn main() {
let mut data = String::new();
let mut f = File::open("/etc/hosts").expect("Unable to open file");
f.read_to_string(&mut data).expect("Unable to read string");
println!("{}", data);
}
读取Vec<u8>的文件
use std::fs::File;
use std::io::Read;
fn main() {
let mut data = Vec::new();
let mut f = File::open("/etc/hosts").expect("Unable to open file");
f.read_to_end(&mut data).expect("Unable to read data");
println!("{}", data.len());
}
写入文件
写入文件与此类似,只不过我们使用了Write特性,并且总是写入字节。你可以使用as_bytes将String / &str转换为bytes:
use std::fs::File;
use std::io::Write;
fn main() {
let data = "Some data!";
let mut f = File::create("/tmp/foo").expect("Unable to create file");
f.write_all(data.as_bytes()).expect("Unable to write data");
}
缓冲I / O
我感觉社区在推动我使用buffreader和buffwriter,而不是直接从文件中读取
缓冲读取器(或写入器)使用缓冲区来减少I/O请求的数量。例如,一次访问磁盘以读取256字节比访问磁盘256次要有效得多。
话虽如此,我不认为缓冲的读写器在读取整个文件时有用。read_to_end似乎以较大的块复制数据,因此传输可能已经自然地合并为更少的I/O请求。
下面是一个阅读的例子:
use std::fs::File;
use std::io::{BufReader, Read};
fn main() {
let mut data = String::new();
let f = File::open("/etc/hosts").expect("Unable to open file");
let mut br = BufReader::new(f);
br.read_to_string(&mut data).expect("Unable to read string");
println!("{}", data);
}
写作方面:
use std::fs::File;
use std::io::{BufWriter, Write};
fn main() {
let data = "Some data!";
let f = File::create("/tmp/foo").expect("Unable to create file");
let mut f = BufWriter::new(f);
f.write_all(data.as_bytes()).expect("Unable to write data");
}
当你想逐行读取时,buffreader更有用:
use std::fs::File;
use std::io::{BufRead, BufReader};
fn main() {
let f = File::open("/etc/hosts").expect("Unable to open file");
let f = BufReader::new(f);
for line in f.lines() {
let line = line.expect("Unable to read line");
println!("Line: {}", line);
}
}