什么是最有效的通用阅读方式"大"文件(可能是文本或二进制文件),而不进入unsafe
区域?当我在网上搜索"以大块方式读取大文件时,我感到惊讶的是很少有相关结果。
例如,我的一个用例是使用rust-crypto
计算文件的MD5校验和(Md5
模块允许您迭代地添加&[u8]
块。
这是我所拥有的,它似乎比read_to_end
等其他方法表现稍好一些:
use std::{
fs::File,
io::{self, BufRead, BufReader},
};
fn main() -> io::Result<()> {
const CAP: usize = 1024 * 128;
let file = File::open("my.file")?;
let mut reader = BufReader::with_capacity(CAP, file);
loop {
let length = {
let buffer = reader.fill_buf()?;
// do stuff with buffer here
buffer.len()
};
if length == 0 {
break;
}
reader.consume(length);
}
Ok(())
}
答案 0 :(得分:7)
我认为你不能比那更有效地编写代码。 fill_buf
BufReader
File
上的BufReader
为basically just a straight call to read(2)
。
那就是说,file.read(&mut buf)
当你像那样使用它时,它并不是一个真正有用的抽象;