从Read到Write

时间:2017-03-29 00:49:01

标签: rust

我有两件物品。一个实现std::io::Read特征,另一个实现std::io::Write特征(例如,两个std::fs::File个实例)。我试图找出一种简单有效的方法将数据从Read实例传输到Write实例。

让我补充一点,我完全了解std::fs::copy,但这仅适用于文件系统上的文件......这些都不是。我还查看了std::io::copy,但它不适用于ReadWrite个实例。

我知道我可以使用以下内容将Read的内容读入Vec<u8>

let mut data = Vec::new();
file.read_to_end(&mut data);

但是read_to_end会填充Vec<u8>,但Writewrite_all上的相应功能会占用&[u8]而我看不到任何方法on Vec<u8>允许我创建一个新数组,只有一些预先指定的大小。

我可以想象几种不同的方法(一次读/写一个字节,读/写块)。但我希望std中有一些功能可以完成所有这些功能(包括所有必需的错误处理,块大小管理等),但是如果它存在,我还没能找到它

有关简单方法的任何建议吗?我确实相对来说是Rust的新手,但是当我说我花了很多时间寻找这样的东西并且无法找到它时,请相信我。是的,我知道在那段时间我可以实施,但我想要一些有效的东西,我担心我写的东西不会是最优的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

  

我还查看了std::io::copy,但它不适用于ReadWrite个实例。

确实如此。查看its signature中的where子句:

pub fn copy<R: ?Sized, W: ?Sized>(reader: &mut R, writer: &mut W) -> Result<u64> 
where R: Read, W: Write

例如,在这里我将stdin重定向到stdout:

use std::io;

fn main() {
  let mut stdin = io::stdin();
  let mut stdout = io::stdout();
  io::copy(&mut stdin,&mut stdout);
}

如果您正在寻找一个可以直接进入和读出的缓冲区,bufstream包中的BufStream应该是有用的。

  

我可以想象几种不同的方法(一次读/写一个字节,读/写块)。但我希望std中有一些功能可以完成所有这些功能(包括所有必需的错误处理,块大小管理等),但如果它存在,我就无法找到它。

那是完全 what std::io::copy does - 它分配一个缓冲区然后在读入该缓冲区之间循环并从该缓冲区写出,直到没有任何东西可以读取。