从读取到写入的最简单方法是什么



我有两个对象。 一个实现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>但是Write上的相应函数write_all,需要&[u8],我在Vec<u8>上看不到任何允许我创建新数组的方法,只有某个预先指定大小的切片。

我可以想象几种不同的方法来做到这一点(一次读/写一个字节,读/写块)。 但是我希望std中有一些功能可以完成所有这些操作(具有所有必要的错误处理,块大小管理等),但如果它在那里,我无法找到它。

关于执行此操作的简单方法的任何建议? 诚然,我对 Rust 相对较新,但请相信我,当我说我花了相当多的时间寻找这样的东西却找不到它时。 是的,我意识到在那段时间我本可以实现,但我想要一些高效的东西,我担心我会写的东西不是最佳的。

感谢您的任何帮助。

我也

看了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

例如,在这里我将 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所做的 - 它分配一个缓冲区,然后在读取到该缓冲区和从该缓冲区写出之间循环,直到没有任何东西可以读取。

最新更新