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が実装されているのかは以下を参照すればいい。