RustでのIOストリーム処理

Go言語のio.Reader, io.Writer interfaceを使ったio.Cooyのような処理をRustで行うためには、std::io::Read traitとstd::io::Write traitを使って各ストリームを扱えばいい。

標準入力から標準出力へデータをコピーするサンプルコードを次に書く。
copy関数にstd::io::StdinのRead traitとstd::io::StdoutのWrite traitを渡して、その間でデータを流している。

use std::io::{self, Read, Write};

fn copy(reader: &mut Read, writer: &mut Write) {
    const BUFFER_SIZE: usize = 32 * 1024;
    let mut buf = [0u8; BUFFER_SIZE];

    while let Ok(n) = reader.read(&mut buf) {
        if n == 0 {
            break;
        }
        let _ = writer.write(&buf[..n]);
    }
}

fn main() {
    let r = io::stdin();
    let mut reader = r.lock();

    let w = io::stdout();
    let mut writer = w.lock();

    copy(&mut reader, &mut writer);
}

なお、std::io::copy関数が標準ライブラリに含まれているため、前述のように自前でcopy関数を実装する必要はない。(書いてから気づいた)

use std::io;

fn main() {
    let r = io::stdin();
    let mut reader = r.lock();

    let w = io::stdout();
    let mut writer = w.lock();

    let _ = io::copy(&mut reader, &mut writer);
}

標準ライブラリのどの型にRead、Write traitが実装されているのかは以下を参照すればいい。

参考