2018-12-03この記事はWanoアドベントカレンダーの3日目の記事です。traitのwrite_allメソッドで一度に書き出す文字列の場合はwrite!もしくはwriteln!マクロがprintln!の様に使う事ができる。文字列/バイト列を少しずつ複数回に分けて書き出すstd::io::BufWriterを使う事以外は一度に書き出す場合と同じどんなAPIがあるの?std::iostd::fsこの2つが標準の同期APIです。std::ioにはRead/Write/Seek/BufReadといった入出力の為のtraitや標準入出力の型(Stdin/Stdout/Stderr)等があります。std::fsにはFile操作の為のFile型やディレクトリ操作の為の関数や型等があります。traitの最もプリミティブな操作であるreadやwriteメソッドは多くの場合に実装が低レイヤー過ぎる為に、他の言語と同様の感覚で使用するとパフォーマンスが出ないという問題が起こります。traitを実装している型(例えばFileやStdinやStdout)を、BufReaderやBufWriter型で包んであげる事でreadやwriteでバッファリングが行われるようになり、他の言語と同様のパフォーマンスを出す事が出来るようになります。v1.26.0以降に追加されたstd::fs::read_to_stringを使用すると簡単です。traitのread_to_stringメソッドを使ったやり方もあります。Ok(())}read_to_stringは引数に読み込んだデータを保存するバッファを要求するので、1つのString変数を使い回すことでメモリアロケーション回数を減らす事も出来ます。traitのlinesメソッドを使ってIteratorとして処理します。traitのread_lineメソッドを使って細かく制御していく事も出来ます。Ok(())}read_lineを用いると改行文字もbufに入るので注意して下さい。traitのread_to_endメソッドを使います。Ok(())}バイト列をバッファに読み込みながら処理したいBufReaderを使って読み込みます。traitのreadメソッドを自分で呼び出して読み込んでいきます。traitのbytesメソッドを呼びます。traitのwrite_allメソッドを使って書き出します。書き込み可能なファイルハンドルはFile型のcreateメソッドで作成します。Ok(())}バイト列ではなく文字列の場合はwrite!またはwriteln!マクロを使う事でprintln!と同じ様に書きだす事ができます。Ok(())}文字列/バイト列を少しずつ複数回に分けて書き出すBufWriterを使う事以外は一度に書き出す場合と基本は同じです。