我有两个物体。一个实现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
呢-它分配一个缓冲区,然后读入该缓冲区,并从该缓冲区写出来,直到有一无所有阅读之间循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句