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
read_exact
不过,您可能可以将其专门用于特定Read
的 s 和Write
s,例如,您可能可以使用内核函数(例如sendfile
在 Linux 中读取和写入文件描述符时),这可能使您避免不必要地通过用户空间复制内容.
推荐阅读
- reactjs - 如何以正确的方式读取组件内的 redux 状态?
- c++ - SCHED_RR 线程上的 Posix 计时器正在使用 100% 的 CPU
- angular - 父组件中的下拉菜单将选定的值传递给子组件并调用不同的 http 请求
- javascript - WebRTC:无法接收远程视频或音频
- ios - Xamarin Forms iOS 版本无法 AOT
- delphi - 为什么这段代码不中断(指向记录指针的指针数组)
- python - 格式化来自非结构化列表的日期字符串和关联值的数据
- python - 时间戳减法必须具有相同的时区或没有时区
- php - 剩余unix时间戳的持续时间
- double - 代号 2 位双数