我正在try 创建一个迭代器,用于从文件中读取大小为chunk_size
的块.我有以下解决方案:
fn read_chunks<R: std::io::Read>(file: &mut R, chunk_size: usize) {
let file_bytes: Vec<u8> = file.bytes().flatten().collect();
let chunk_iter = file_bytes.chunks(chunk_size);
// rest of code omitted ...
}
但是,它对于大文件来说太慢了.我注意到以下几点要快得多:
fn read_chunks<R: std::io::Read>(file: &mut R, chunk_size: usize) {
loop {
let mut buf = vec![0u8; chunk_size]
match file.read_exact(&mut buf) {
Ok(()) => {
// code for handling each chunk omitted
}
Err(e) if e.kind() == std::io::error::ErrorKind::UnexpectedEoF => {
break;
}
}
}
}
但是如何将其作为迭代器返回呢?我想让它像chunk_iter
一样,我可以将它与其他迭代器结合使用.
直觉上,我想写这样的东西(类似于python中的生成器):
fn read_chunks_iter<'a, R: std::io::Read>(file &mut R, chunk_size: usize)
-> Iterator<Item=&'a [u8]>
{
loop {
let mut buf = vec![0u8; chunk_size]
match file.read_exact(&mut buf) {
Ok(()) => {
yield buf;
}
Err(e) if e.kind() == std::io::error::ErrorKind::UnexpectedEoF => {
break;
}
}
}
}