Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
io.Reader / Writer / bufio
GoのI/Oはインタフェースで抽象化されており、『io.Reader』と『io.Writer』を軸に設計されています。『bufio』パッケージはバッファリングによって効率的なI/Oを実現します。
構文
// io.Reader インタフェース(読み取り)
type Reader interface {
Read(p []byte) (n int, err error)
}
// io.Writer インタフェース(書き込み)
type Writer interface {
Write(p []byte) (n int, err error)
}
// バッファリングされたリーダーを作成する
br := bufio.NewReader(reader)
// バッファリングされたライターを作成する
bw := bufio.NewWriter(writer)
// 行単位で読み込むスキャナーを作成する
scanner := bufio.NewScanner(reader)
関数一覧
| 関数 / メソッド | 概要 |
|---|---|
| bufio.NewReader(r) | io.Reader をラップしたバッファリングリーダーを作成します。大きなデータを効率的に読み込めます。 |
| bufio.NewWriter(w) | io.Writer をラップしたバッファリングライターを作成します。小さな書き込みをまとめて処理します。 |
| bufio.NewScanner(r) | 行単位やワード単位でテキストを読み込むスキャナーを作成します。 |
| scanner.Scan() | 次のトークン(デフォルトは行)を読み込みます。データがなければ false を返します。 |
| scanner.Text() | 直前の Scan() で読み込んだトークンを文字列で返します。 |
| bw.Flush() | バッファに残っているデータを実際の出力先に書き出します。書き込み後に必ず呼び出します。 |
| io.Copy(dst, src) | src から dst へデータをコピーします。ファイルコピーなどに便利です。 |
サンプルコード
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
// 文字列から Reader を作って行単位で読み込む
text := "1行目\n2行目\n3行目\n"
reader := strings.NewReader(text)
scanner := bufio.NewScanner(reader)
fmt.Println("--- 行単位で読み込み ---")
for scanner.Scan() {
fmt.Println(scanner.Text())
}
// bufio.Writer でまとめて書き込む
bw := bufio.NewWriter(os.Stdout)
fmt.Fprintln(bw, "--- バッファリング書き込み ---")
fmt.Fprintln(bw, "バッファに書き込み中...")
bw.Flush() // Flush しないと出力されない
// bufio.Reader で1行ずつファイルを読む
f, _ := os.CreateTemp("", "sample*.txt")
defer os.Remove(f.Name())
f.WriteString("hello\nworld\n")
f.Seek(0, 0)
br := bufio.NewReader(f)
for {
line, err := br.ReadString('\n')
fmt.Print("読み込み: ", line)
if err != nil {
break
}
}
}
概要
『io.Reader』と『io.Writer』はGoのI/O設計の根幹です。ファイル・ネットワーク・文字列など異なるデータソースを同じインタフェースで扱えるため、汎用的なコードを書けます。
『bufio』はシステムコールの回数を減らしてI/Oを高速化します。『bufio.Writer』を使った場合、最後に必ず『Flush()』を呼び出してください。Flush() を忘れるとバッファの内容が出力されないまま終了します。テキストファイルの行単位読み込みには『bufio.Scanner』が最も簡潔に書けます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。