01.Rust学习-文件读取

简介

学习使用Rust进行简单的文件读取操作。

一次性读入

优点:

  • 处理包含字符串内容的文件;
  • 可以一次整体处理;

缺点:

  • 过大的文件可能会对性能产生严重影响;
  • 文件越大,程序内存消耗就越大;
  • 某些文件不能处理,如二进制内容的文件不能以这种方式处理;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    use std::env;
    use std::fs;

    fn main() {
    let args:Vec<String>= env::args().collect();

    let fpath = &args[1];

    let contents:String = fs::read_to_string(fpath)
    .expect("读取文件失败");

    for line in contents.lines() {
    println!("{}",line);
    }
    }

按行读取

Rust在其标准库提供的BufReader方法,它是在Reader方法基础之上进行了一些细节优化,这种方法可以处理以下特点的文件:

  • 包含字符串内容的文件
  • 不能一次处理太大的文件
    然而,这种方法也有一些缺点:
  • 它只适用于字符串内容的文件;
  • 实现可能很快变得更加复杂;
  • 根据文件的格式,如果不是要处理的所有内容都放在同一行,则可能需要自己缓冲行;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    use std::io::{ stdin, BufRead, BufReader};
    use std::env;
    use std::fs::File;
    use std::path::Path;

    fn main() {
    let args:Vec<String> = env::args().collect();

    let read_from : Box<dyn BufRead> = if args.len() > 1 {
    let fpath = args.get(1).expect("cannot get argument!");
    let file = File::open(Path::new(fpath))
    .expect(format!("cannot open{}",fpath).as_str());
    Box::new(BufReader::new(file))
    } else {
    Box::new(BufReader::new(stdin()))
    // Box::new(stdin().lock())
    };
    for line in read_from.lines() {
    let line = line.unwrap();

    println!("{}--{}",line,line.len());
    }
    }

对于生信方面,常用的也就是按行读取文件或者全部一次性读入。当然读取文件还有其它方式,比如按字节块读取,以单个字节逐步读取等,这些方式在Rust中均能实现。

参考资料

Rust Read、BufRead、BufReader
文件系统和进程

-------------本文结束感谢您的阅读-------------

本文标题:01.Rust学习-文件读取

文章作者:Fangj

发布时间:2024年01月16日 - 21:01

最后更新:2024年10月23日 - 21:10

原始链接:https://biofang.github.io/2024/01/16/01-Rust学习-文件读取/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。