我试图编写一个函数,将用户指定数量的字节从读取器复制到写入器,然后我想到了:
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
我不知道该如何解决。
答案 0 :(得分:0)
我不认为您会比仅使用通用的Data %>% mutate(val1 = coalesce(va1p1,val1p2,val1p3)
/ Read
接口获得更好的表现(除非您可能不应该使用{ {1}},如果您可以填满整个缓冲区,则可能会导致不必要的阻塞。
但是,您可能可以将其专门用于特定的Write
和read_exact
,例如,您可以在读取和写入时使用内核功能(例如sendfile
) Linux中的文件描述符),这可能使您避免不必要地通过用户空间复制内容。
答案 1 :(得分:-2)
我对copy_n
的实现看起来像这样(playground)
pub fn copy_n<R: ?Sized, W: ?Sized>(reader: &mut R, writer: &mut W, count: usize) -> io::Result<()>
where R: Read, W: Write
{
let mut buf = vec![];
unsafe {
buf.reserve(count);
buf.set_len(count);
}
reader.read_exact(&mut buf)?;
writer.write_all(&buf)?;
Ok(())
}
此解决方案仅使用read_exact
和write_all
,可以保证读取/写入整个缓冲区,否则会发生错误,因此应该没事。