直接从Rust的读者写

时间:2017-03-01 13:57:11

标签: rust

如何将数据从阅读器流式传输到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<()> {
  // ?
}

1 个答案:

答案 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>