3 个不稳定版本
0.2.0 | 2023 年 11 月 2 日 |
---|---|
0.1.1 | 2023 年 11 月 1 日 |
0.1.0 | 2023 年 11 月 1 日 |
#1604 in 文件系统
10KB
read_chunks
此 crate 为实现 Read
的类型提供扩展,允许它们以大块数据读取文件,直到文件末尾,类似于 slice::chunks
的工作方式。
许可
此 crate 以 MIT OR Apache-2.0
双许可,这是为了使其与 Rust 标准库的许可兼容。
lib.rs
:
一个提供 read_chunks
扩展的 crate,该扩展适用于实现 std::io::Read
(包括无尺寸的)的类型。
动机
有时你可能需要读取整个文件以进行处理,但不希望在内存中保留整个文件。有时 bytes
是这个问题的答案,但如果你想一次性处理更大的数据块,比如用于 SIMD,那就不能使用了。
重复调用 read
以获取一个块直到文件末尾是很繁琐的,因为它可能返回比预期少得多的字节(减慢了批量处理速度),或者遇到可恢复的错误,并且自己处理它是一项繁琐的工作。
一个更正确的实现可能是使用 read_exact
来完成这个目的,因为它保证了整个块。问题是,在文件末尾,你将丢失读取的数据,因为 read_exact
在 EOF 时未指定缓冲区的内容。
该包中实现的方法解决了这两个问题,它确保在可能的情况下始终提供请求的全缓冲区大小,处理可恢复的错误,并在Read流结束时简单地返回一个更小的缓冲区,然后返回None
以表示检测到流结束。也就是说,您将始终获得完整的缓冲区长度,直到最后一个包含尾部的块,类似于slice::chunks
,但针对Read
。
使用方法
只需将use read_chunks::ReadExt;
添加到您的模块中,并使用新的read_chunks
方法,该方法应出现在任何实现Read
的类型上。
标准库包含
编写此包是因为它对我使用SIMD优化的哈希函数(如blake3)对文件进行增量哈希很有用。如果认为它具有普遍的实用性,并且人们同意其设计,则可能将此包添加到Rust标准库中。因此,API可能需要中断以原型设计最适合标准库的API。
特别是,可能需要一个read_chunks_exact
API,它类似于slice::chunks_exact
,在单独的函数中返回剩余部分,并在主迭代器中断言缓冲区长度保持不变,
还可能对返回类型应该是&[u8]
还是&mut [u8]
提出疑问。目前返回的是&mut [u8]
,因为实现允许这样做,但目前尚不清楚这作为API是否合理。