从文件中读取一系列字节的最惯用方法

Mat*_*nti 5 file rust

我有一个文件,比如说myfile。使用 Rust,我想打开myfile并将字节 N 到 M 读入 a中Vecmyvec最惯用的方法是什么?天真地,我想到使用bytes(), then skip, takeand collect,但这听起来效率很低。

Tho*_*mas 10

惯用的(据我所知)和相对有效的方法:

let start = 10;
let count = 10;

let mut f = File::open("/etc/passwd")?;
f.seek(SeekFrom::Start(start))?;
let mut buf = vec![0; count];
f.read_exact(&mut buf)?;
Run Code Online (Sandbox Code Playgroud)

您在评论中表示您担心在读入内存之前将内存清零的开销。事实上,这样做的成本不为零,但与从文件中读取所需的 I/O 操作相比,它通常可以忽略不计,而且优点是您的代码保持 100% 健全。但出于教育目的,我试图想出一种避免归零的方法。

不幸的是,即使使用不安全的代码,我们也无法安全地将未初始化的缓冲区传递给,read_exact因为文档中的这一段(强调我的):

不保证调用此函数时的内容buf,实现不能依赖 buf 内容的任何属性为 true。建议实现仅写入数据buf而不是读取其内容。

因此,从提供的缓冲区中读取数据在技术上是合法的,这意味着我们不能在这里合法地传递未初始化的数据File::read_exact使用MaybeUninit

  • 我想你可以这样做:`let mut v = Vec::with_capacity(count); r.take(count).read_to_end(&mut v);`,但我不知道它是否会很明显甚至更糟。无论如何,IME、缓冲区清零从来没有像人们预期的那样对性能产生如此大的影响。 (2认同)