【问题标题】:How do I read chunk by chunk from a type that implements Read? [duplicate]如何从实现 Read 的类型中逐块读取? [复制]
【发布时间】:2020-07-28 00:55:08
【问题描述】:

我需要将数据读入精确大小的块(最后一个块可能被部分填充)。理想情况下,此方法也适用于 Read 的所有类型。我最初的想法是这样的:

use std::io::{self, prelude::*};
use std::error;

const CHUNK_SIZE: usize = 2;

fn main() -> Result<(), Box<dyn error::Error>> {
    let mut a = &[1u8, 2, 3, 4, 5][..]; // Some Read type
    let mut buf = vec![0u8; CHUNK_SIZE];
    loop {
        match a.read_exact(&mut buf) {
            Ok(_) => println!("{:?}", buf),
            Err(ref e) if e.kind() == io::ErrorKind::UnexpectedEof => break,
            Err(e) => return Err(e.into()),
        }
    }
    buf.clear();
    a.read_to_end(&mut buf)?;
    println!("{:?}", buf);
    Ok(())
}

这个玩具示例有效;但是,阅读documentation for Read 我似乎无法推断它是否正确。文档说,在read_exact 失败后,无法假设缓冲区内容。失败的read_exact 之后的read_to_end 是否总是会检索那些剩余的字节?

这段代码是正确的还是有更好的读取块的方法?

【问题讨论】:

标签: rust io


【解决方案1】:

如果您想确保分块读取工作,请使用read,而不是read_exactread 返回带有读取字节数的 Result&lt;usize&gt;,如果达到 EOF,则返回 0。这将确保它适用于部分数据。

【讨论】:

  • 这总是有可能的,尤其是对于所有 Read 或其他东西实现的 ChunkRead 特征。鉴于read_exactly 与我想要的非常接近,我只是希望有一些更惯用/内置的东西。
猜你喜欢
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2014-11-15
  • 2020-07-14
  • 2012-05-18
相关资源
最近更新 更多