从Read到Write管道的最简单方法是什么

Mic*_*ler 2 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);
Run Code Online (Sandbox Code Playgroud)

但是,read_to_end填补了Vec<u8>,但是,相应的功能Write,write_all,需要一个&[u8]和我没有看到任何方法上Vec<u8>,让我来创建一个新的阵列,只有一些预先指定大小的片.

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

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

谢谢你的帮助.

Ale*_*lec 7

我也看了一下std::io::copy,但它不适用于ReadWrite实例.

确实如此.查看其签名中的where子句:

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

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

use std::io;

fn main() {
  let mut stdin = io::stdin();
  let mut stdout = io::stdout();
  io::copy(&mut stdin,&mut stdout);
}
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找一个可以正确进入和读出的缓冲区,BufStream那么bufstream应该使用它.

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

也就是说究竟 是什么std::io::copy -它分配一个缓冲区,然后读入该缓冲区,并从该缓冲区写出来,直到有一无所有阅读之间循环.


归档时间:

查看次数:

1315 次

最近记录:

8 年,9 月 前