简介
学习使用Rust进行简单的文件读取操作。
一次性读入
优点:
- 处理包含字符串内容的文件;
- 可以一次整体处理;
缺点:
- 过大的文件可能会对性能产生严重影响;
- 文件越大,程序内存消耗就越大;
- 某些文件不能处理,如二进制内容的文件不能以这种方式处理;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15use 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
23use 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中均能实现。