我有两个对象。 一个实现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]
,我在Vec<u8>
上看不到任何允许我创建新数组的方法,只有某个预先指定大小的切片。
我可以想象几种不同的方法来做到这一点(一次读/写一个字节,读/写块)。 但是我希望std
中有一些功能可以完成所有这些操作(具有所有必要的错误处理,块大小管理等),但如果它在那里,我无法找到它。
关于执行此操作的简单方法的任何建议? 诚然,我对 Rust 相对较新,但请相信我,当我说我花了相当多的时间寻找这样的东西却找不到它时。 是的,我意识到在那段时间我本可以实现,但我想要一些高效的东西,我担心我会写的东西不是最佳的。
感谢您的任何帮助。
看了
std::io::copy
,但它不适用于Read
和Write
实例。
确实如此。查看其签名中的 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 中有一些功能可以完成所有这些(具有所有必要的错误处理、块大小管理等),但如果它在那里,我就找不到它。
这正是std::io::copy
所做的 - 它分配一个缓冲区,然后在读取到该缓冲区和从该缓冲区写出之间循环,直到没有任何东西可以读取。