Rust 读写文件

180it 2021-05-11 AM 520℃ 0条

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及更高版本
这些形式比为您分配aString或Vecfor的单行函数稍微冗长一些,但是功能更强大,因为您可以重用已分配的数据或追加到现有对象。

读取数据
读取文件需要两个核心部分: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());
}

写一个文件
写入文件是类似的,除了我们使用Writetrait并总是写出字节。您可以使用将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);
    }
}
支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

Rust 读写文件