我有两个对象.一个实现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);
Run Code Online (Sandbox Code Playgroud)
但是,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
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 次 |
| 最近记录: |