rust - 如何直接将有限字节从读取器复制到写入器

标签 rust

<分区>

我试图编写一个函数,将用户指定的字节数从读取器复制到写入器,我想到了这个:

fn io_copy(
    reader: &mut std::io::Read,
    writer: &mut std::io::Write,
    byte_count: usize,
) -> std::io::Result<()> {
    let mut buffer: [u8; 16384] = unsafe { std::mem::uninitialized() };
    let mut remaining = byte_count;
    while remaining > 0 {
        let to_read = if remaining > 16384 { 16384 } else { remaining };

        reader.read_exact(&mut buffer[0..to_read])?;
        remaining -= to_read;
        writer.write(&buffer[0..to_read])?;
    }

    Ok(())
}

它工作正常,但我想在没有任意大小的中间缓冲区的情况下完成它,我想知道这样的函数是否已经存在。我找到了 std::io::copy ,但这会复制整个流,而我只想复制有限的数量。我想我可以在阅读器上使用 take,但我无法消除错误。这是我目前所拥有的:

fn io_copy<R>(reader: &mut R, writer: &mut std::io::Write, byte_count: usize) -> std::io::Result<()>
where
    R: std::io::Read + Sized,
{
    let mut r = reader.by_ref().take(byte_count as u64);
    std::io::copy(&mut r, writer)?;
    Ok(())
}

这给了我一个错误:

error[E0507]: cannot move out of borrowed content
 --> src/lib.rs:6:21
  |
6 |         let mut r = reader.by_ref().take(byte_count as u64);
  |                     ^^^^^^^^^^^^^^^ cannot move out of borrowed content

我不知道如何解决这个问题。

最佳答案

我不认为你会比仅使用通用的 Read/Write 接口(interface)(除了你在您可以填充整个缓冲区的情况下,可能不应该使用 read_exact,这可能会导致不必要的阻塞。

虽然您可以针对特定的 ReadWrite 专门化它,例如,您可以使用内核函数(例如 sendfile 阅读时从和写入 Linux 中的文件描述符)这可能会让你避免不必要地通过用户空间复制东西。

关于rust - 如何直接将有限字节从读取器复制到写入器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52511497/

相关文章:

rust - 为什么 MSVC 没有安装或被 Rust 识别?

rust - 如何将 impl Fn 存储在枚举类型中?

vector - Rust - 大小在运行时定义的向量

rust - 穷举整数匹配

rust - 如何指定依赖于单独类型中闭包的借用绑定(bind)的生命周期?

rust - 一个实现什么时候想要在 Rust 中获得 self 的所有权?

rust - 为什么在需要&Vec <&'a str>的地方使用nomicon布局章节&Vec <&'static str> couldn'?

rust - Rust Petgraph WASM项目,尝试将struct与Graph属性一起使用,但需要2个参数

pointers - 将具有多个变量的结构写入单个字节数组

rust - 如何在立即丢弃向量时将值移出向量?