我在这里展示的所有功能都没有单独引起恐慌,但是我正在使用,expect
因为我不知道哪种错误处理最适合您的应用程序。去阅读锈病程序设计语言的出错处理一章,以了解如何适当地自己的程序处理失败。
Rust 1.26及更高版本
如果您不想关心基本细节,则可以使用单行功能进行读写。
读取文件到 String
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
,但是功能更强大,因为您可以重复使用分配的数据或追加到现有对象。
读取数据
读取文件需要两个核心部分:File
和Read
。
读取文件到 String
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
trait并总是写出字节。您可以使用将String
/ 转换&str
为字节as_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
我感到社区的推动使用BufReader
,BufWriter
而不是直接从文件中读取
缓冲的读取器(或写入器)使用缓冲区来减少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");
}
BufReader
当您想逐行阅读时,A 更为有用:
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);
}
}