new file会创建文件吗_Rust 文件系统处理之文件读写 Rust 实践指南

ab15716721a26c69c3477cf7ec5586a9.png

Rust 中,文件读写处理简单而高效。代码也很紧凑,容易阅读。我们从读取文件的字符串行、避免读取写入同一文件、使用内存映射随机访问文件这三个文件处理中的典型案例来了解一下。

d33125a3fe5a2929c2a052104dea2edc.png

文件处理场景大家都很熟悉,因此闲言少叙,直接看代码。

读取文件的字符串行

我们向文件写入三行信息,然后使用 BufRead::lines 创建的迭代器 Lines 读取文件,一次读回一行。File 模块实现了提供 BufReader 结构体的 Read trait。File::create 打开文件 File 进行写入,File::open 则进行读取。

use std::fs::File;use std::io::{Write, BufReader, BufRead, Error};fn main() -> ResultError> {    let path = "lines.txt";    let mut output = File::create(path)?;    write!(output, "Rust\n?\nFun")?;    let input = File::open(path)?;    let buffered = BufReader::new(input);    for line in buffered.lines() {        println!("{}", line?);    }    Ok(())}

文件处理中避免读写同一文件

对文件使用 same_file::Handle 结构体,可以测试文件句柄是否等同。在本实例中,将对要读取和写入的文件句柄进行相等性测试。

use same_file::Handle;use std::fs::File;use std::io::{BufRead, BufReader, Error, ErrorKind};use std::path::Path;fn main() -> Result {    let path_to_read = Path::new("new.txt");    let stdout_handle = Handle::stdout()?;    let handle = Handle::from_path(path_to_read)?;    if stdout_handle == handle {        return Err(Error::new(            ErrorKind::Other,            "You are reading and writing to the same file",        ));    } else {        let file = File::open(&path_to_read)?;        let file = BufReader::new(file);        for (num, line) in file.lines().enumerate() {            println!("{} : {}", num, line?.to_uppercase());        }    }    Ok(())}

使用内存映射随机访问文件

使用 memmap 创建文件的内存映射,并模拟文件的一些非序列读取。使用内存映射意味着您仅需索引一个切片,而不是使用 seek 方法来导航整个文件。

map::map 函数假定内存映射后的文件没有被另一个进程同时更改,否则会出现竞态条件。

use memmap::Mmap;use std::fs::File;use std::io::{Write, Error};fn main() -> ResultError> {    write!(File::create("content.txt")?, "My hovercraft is full of eels!")?;    let file = File::open("content.txt")?;    let map = unsafe { Mmap::map(&file)? };    let random_indexes = [0, 1, 2, 19, 22, 10, 11, 29];    assert_eq!(&map[3..13], b"hovercraft");    let random_bytes: Vec = random_indexes.iter()        .map(|&idx| map[idx])        .collect();    assert_eq!(&random_bytes[..], b"My loaf!");    Ok(())}

以上实例代码都是完整的、可独立运行的程序,因此你可以直接复制它们到自己的项目中进行试验。

如果希望从头了解如何运行上述实例代码,请参考《Rust 实践指南》中关于本书-如何使用本书实例部分。也可以复制链接:http://budshome.com/rust-cookbook/about.html0872c548dbdf50fbe88ab710a862bd11.png 点击阅读原文进行更详细的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值