使用bufio包可显著提升go文件i/o性能。1. 按行读取文本用bufio.scanner,自动处理换行;2. 大块数据读取用bufio.reader,支持自定义缓冲;3. 缓冲写入用bufio.writer,减少系统调用,需调用flush()确保数据写入。注意缓冲区大小设置、内存溢出及并发写入安全。

在Go语言中进行文件I/O操作时,使用缓冲读写能显著提升性能,尤其是在处理大文件或频繁读写场景下。直接使用
os.File的
Read和
Write方法虽然可行,但效率较低。标准库
bufio包提供了带缓冲的读写功能,是实际开发中的推荐做法。
使用 bufio 进行缓冲读取
Go 的
bufio.Scanner和
bufio.Reader提供了高效的缓冲读取方式。 1. 按行读取(适合文本文件)
使用
bufio.Scanner可以方便地逐行读取文件内容,自动处理换行符,并且默认缓冲大小足够应对大多数场景。
file, err := os.Open("example.txt")<br>if err != nil {<br> log.Fatal(err)<br>}<br>defer file.Close()<br><br>scanner := bufio.NewScanner(file)<br>for scanner.Scan() {<br> line := scanner.Text()<br> fmt.Println(line)<br>}<br><br>if err := scanner.Err(); err != nil {<br> log.Fatal(err)<br>}
2. 自定义缓冲读取(处理大块数据)当需要读取非文本数据或控制读取块大小时,可使用
bufio.Reader。
立即学习“go语言免费学习笔记(深入)”;
reader := bufio.NewReader(file)<br>buf := make([]byte, 4096)<br>for {<br> n, err := reader.Read(buf)<br> if n > 0 {<br> // 处理 buf[0:n]<br> fmt.Printf("读取 %d 字节\n", n)<br> }<br> if err == io.EOF {<br> break<br> }<br> if err != nil {<br> log.Fatal(err)<br> }<br>}
使用 bufio 进行缓冲写入
频繁调用
Write会导致大量系统调用,降低性能。
bufio.Writer可将数据先写入内存缓冲区,累积到一定量后再批量写入磁盘。 1. 缓冲写入示例
file, err := os.Create("output.txt")<br>if err != nil {<br> log.Fatal(err)<br>}<br>defer file.Close()<br><br>writer := bufio.NewWriter(file)<br><br>data := []string{"行1", "行2", "行3"}<br>for _, line := range data {<br> _, err := writer.WriteString(line + "\n")<br> if err != nil {<br> log.Fatal(err)<br> }<br>}<br><br>// 必须调用 Flush,确保数据写入磁盘<br>err = writer.Flush()<br>if err != nil {<br> log.Fatal(err)<br>}
2. 设置自定义缓冲区大小可根据应用场景调整缓冲区大小,例如处理大量数据时使用更大缓冲区。
writer := bufio.NewWriterSize(file, 32*1024) // 32KB 缓冲区
性能建议与注意事项
缓冲I/O虽能提升性能,但需注意以下几点:
- 写入完成后务必调用
Flush()
,否则缓冲区数据可能不会写入文件 - 大文件读写建议使用固定大小的缓冲区,避免一次性加载全部内容导致内存溢出
- 二进制文件读取应使用
bufio.Reader
而非Scanner
,后者针对文本设计 - 并发写入时需加锁保护
Writer
,或使用单独的写入协程
基本上就这些。合理使用
bufio包中的类型,能让你的文件操作更高效、更安全。缓冲机制虽小,但在实际项目中影响显著。不复杂但容易忽略。










