我有两件物品。一个实现std::io::Read
特征,另一个实现std::io::Write
特征(例如,两个std::fs::File
个实例)。我试图找出一种简单有效的方法将数据从Read
实例传输到Write
实例。
让我补充一点,我完全了解std::fs::copy
,但这仅适用于文件系统上的文件......这些都不是。我还查看了std::io::copy
,但它不适用于Read
和Write
个实例。
我知道我可以使用以下内容将Read
的内容读入Vec<u8>
:
let mut data = Vec::new();
file.read_to_end(&mut data);
但是read_to_end
会填充Vec<u8>
,但Write
,write_all
上的相应功能会占用&[u8]
而我看不到任何方法on Vec<u8>
允许我创建一个新数组,只有一些预先指定的大小。
我可以想象几种不同的方法(一次读/写一个字节,读/写块)。但我希望std
中有一些功能可以完成所有这些功能(包括所有必需的错误处理,块大小管理等),但是如果它存在,我还没能找到它
有关简单方法的任何建议吗?我确实相对来说是Rust的新手,但是当我说我花了很多时间寻找这样的东西并且无法找到它时,请相信我。是的,我知道在那段时间我可以实施,但我想要一些有效的东西,我担心我写的东西不会是最优的。
感谢您的帮助。
答案 0 :(得分:7)
我还查看了
std::io::copy
,但它不适用于Read
和Write
个实例。
确实如此。查看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 - 它分配一个缓冲区然后在读入该缓冲区之间循环并从该缓冲区写出,直到没有任何东西可以读取。