如何将数据从阅读器流式传输到Rust中的写入?
我的最终目标实际上是以流式方式写出一些gzip压缩数据。我似乎缺少的是一个迭代读取器数据并将其写入文件的函数。
使用read_to_string等可以轻松完成此任务。但我的要求是流式传输数据以降低内存使用率。我无法找到一个简单的方法来做这个没有大量缓冲区分配。
use std::io;
use std::io::prelude::*;
use std::io::{BufReader};
use std::fs::File;
use flate2::read::{GzEncoder};
use flate2::{Compression};
pub fn gzipped<R: Read>(file: String, stream: R) -> io::Result<()> {
let file = File::create(file)?;
let gz = BufReader::new(GzEncoder::new(stream, Compression::Default));
read_write(gz, file)
}
pub fn read_write<R: BufRead, W: Write>(mut r: R, mut w: W) -> io::Result<()> {
// ?
}
答案 0 :(得分:3)
您的read_write
功能听起来与io::copy完全相同。所以这将是
pub fn gzipped<R: Read>(file: String, stream: R) -> io::Result<u64> {
let mut file = File::create(file)?;
let mut gz = BufReader::new(GzEncoder::new(stream, Compression::Default));
io::copy(&mut gz, &mut file)
}
唯一的区别是io::copy
接受可变引用,并返回Result<u64>
。