Go bufio包:带缓冲的I/O操作
学习使用bufio包提高I/O性能,包括带缓冲的读写、Scanner和行读取。 · 难度:入门 · +15XP
Go bufio包:带缓冲的I/O操作
bufio包在io包的基础上提供了带缓冲的读写功能,通过减少系统调用次数大幅提升I/O性能。核心类型包括Reader、Writer和Scanner。
1. bufio.Reader
通过bufio.NewReader(rd)创建,默认缓冲区大小为4096字节。常用方法:
| 方法 | 说明 |
|---|---|
| Read(p []byte) | 读取数据到切片 |
| ReadByte() | 读取一个字节 |
| ReadString(delim byte) | 读取直到遇到分隔符,返回字符串 |
| Peek(n int) | 查看接下来的n个字节但不移动位置 |
r := bufio.NewReader(strings.NewReader("Hello, World!"))
line, _ := r.ReadString(',')
fmt.Println(line) // 输出: Hello,
// Peek示例
peeked, _ := r.Peek(6)
fmt.Println(string(peeked)) // 输出: World
2. bufio.Writer
通过bufio.NewWriter(w)创建,数据先写入缓冲区,当缓冲区满或调用Flush()时才真正写入底层Writer。
var buf bytes.Buffer
w := bufio.NewWriter(&buf)
w.WriteString("Hello ")
w.WriteString("World!")
w.Flush() // 必须调用,否则数据不会写入buf
fmt.Println(buf.String())3. bufio.Scanner(推荐)
Scanner是读取行或单词最方便的方式。它内置了缓冲,支持自定义分割函数。
scanner := bufio.NewScanner(strings.NewReader("line1
line2
line3"))
for scanner.Scan() {
fmt.Println(scanner.Text()) // 逐行输出
}
if err := scanner.Err(); err != nil {
fmt.Println("Error:", err)
}4. 练习提示
使用bufio.Scanner读取标准输入,统计单词个数。提示:设置scanner.Split(bufio.ScanWords)来按单词分割。