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

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

读取文件的字符串行

我们向文件写入三行信息,然后使用 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.html 点击阅读原文进行更详细的学习。

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

  1. php文件读取文件内容,PHP文件系统函数-读取文件内容几种方式

    介绍几种php获取文件内容的方式 介绍读取文件的方式之前,我们先看一下打开文件资源和关闭资源 名字资源绑定到一个流 - fopen 关闭一个已打开的文件指针 - fclose $handle1 = f ...

  2. linux每个文件标识,Linux文件系统中每个文件用____来标识。

    Linux文件系统中每个文件用____来标识. 更多相关问题 [问答题] 分析冶炼终点硫高的原因及处理措施? [单选] 转炉炼钢的主要金属料是指() [问答题] 复合脱氧剂的优点? [问答题] 什么是 ...

  3. linux的虚拟文件系统四(文件系统理论)

    1. linux文件系统 文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构.linux会将这些分属不同分区的.单独的文件系统按一定的方式形成一个系统的总的 ...

  4. 【Linux】Linux 文件系统与设备文件

    Ref: <Linux设备驱动开发详解:基于最新的Linux4.0内核>中的第5章<Linux 文件系统与设备文件> 基于Linux 5.10   本文结合源码和实例分析了Li ...

  5. c++创建文件_JavaNote 文件系统及Java文件基本操作

    文件概述 文件系统是由OS(操作系统)管理的: 文件系统和Java进程是平行的,是两套系统: 文件系统是由文件夹和文件递归组合而成: 文件目录分隔符 Linux/Unix 用/隔开 Windows用隔 ...

  6. 关于Java里面File类创建txt文件重复???

    private JButton getOpenButton() {if (openButton == null) {openButton = new JButton();openButton.setT ...

  7. 【训练过程】1) Create Training File(创建训练文件)

    1) Create Training File(创建训练文件) Put the folders of VOC dataset(clean images是原始的干净图像(VOC)), collected ...

  8. java new file会创建文件吗_Java高级——文件与I/O流

    简介 本文分为四个部分,首先是介绍File类,概括了一下概念.构造方法及常用方法等,其次是描述了面对对象的三大特征,再次是对抽象类进行了简单的概述,最后从特性.使用等等几个方面对接口进行了一定的描述. ...

  9. new file会创建文件吗_Python处理文件—os模块

    点击上方"扎心了Python",选择"置顶公众号"来源:white_study:https://www.jianshu.com/p/552695bd066f关键 ...

最新文章

  1. IDC:2018年中国人工智能市场规模达17.6亿美元
  2. 第三话 开关说它不认识“2”
  3. 开课吧python视频百度云-做摄影2年,工资5000,兼职2W...
  4. WPF 4 开发Windows 7 跳转列表(JumpList)
  5. 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
  6. spring data redis使用示例
  7. 值得尝试的 3 个 Linux 终端
  8. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制
  9. java亮剑_黄金矿工3-太空版
  10. Python简单的抓取静态网页内容
  11. 2011年想要惊喜的5z20
  12. mysql sillyr x.so_mysql2.so:libmysqlclient_r.so.15:无法打开共享对象文件:没有这样的文件或目录...
  13. 重磅:服务器基础知识全解终极版(145页PPT)
  14. (ubuntu 下)tensorflow 的安装及版本升级
  15. http缓存与cdn相关技术
  16. Ubuntu安装caffe教程
  17. 中国省份区域json
  18. TechParty Mini+4 logging
  19. linux下安装xamp
  20. 腾讯linux集成化界面,腾讯TOS系统今日开启内测:界面扁平化风格

热门文章

  1. java 顺序存储键值对_java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)...
  2. php 网络图片 转本地,PHP将Base64图片转换为本地图片并保存
  3. 优化matlab作业,现代设计优化算法MATLAB实现
  4. JDK源码解析之 java.lang.Long
  5. MongoDB(二):MongoDB的安装
  6. WordPress 首页显示摘要
  7. linux一键安装node+npm
  8. nginx配置 vue打包后的项目 解决刷新页面404问题|nginx配置多端访问
  9. 源码安装nginx以及平滑升级
  10. perl anyevent socket监控web日志server