2017-03-01 10 views
1

リーダーから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<()> { 
    // ? 
} 
+0

非常によく似た質問が見つかりました:[ストリームから特定のバイト数を読み取る方法](http://stackoverflow.com/questions/30412521/how-to-read-specific-number-of-bytes-from- a-stream)。 –

答えて

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>を返すことであるだろう。

+0

ありがとう!イラストレーターや読者、作家から簡単にこれを見られるようにするために、Rustのドキュメントに何かを追加できるかどうかを見ていきます。 –

+0

コピー引数に&mutが必要だと思います。 –

+0

@GregWeberありがとうございます。 –

関連する問題