答案:bufio包通过缓冲I/O减少系统调用,提升Go语言文件和网络操作效率。1. 使用Scanner按行或单词读取文本;2. 使用Reader灵活读取指定分隔符或字节;3. 使用Writer合并写操作,需调用Flush确保数据落盘;4. 组合Reader和Writer实现高效文件处理,适用于大文件流式读写,避免内存溢出。

在Go语言中,bufio 包提供了带缓冲的I/O操作,能显著提升文件或网络读写效率。相比直接使用 os 或 io 包进行无缓冲读写,bufio通过减少系统调用次数来优化性能。下面通过几个常见场景展示其基本用法。
1. 使用 bufio.Scanner 逐行读取文本
从文件或标准输入中按行读取内容是常见需求。bufio.Scanner 提供了简单高效的接口。
package mainimport ( "bufio" "fmt" "strings")func main() { text := "第一行\n第二行\n第三行" reader := strings.NewReader(text) scanner := bufio.NewScanner(reader) for scanner.Scan() { fmt.Println("读取:", scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("读取错误:", err) }}
Scanner 默认按行分割,也可通过 scanner.Split(bufio.ScanWords) 改为按单词读取。
2. 使用 bufio.Reader 读取大块数据或自定义分隔符
当需要更灵活控制读取行为时,可使用 bufio.Reader。它支持读取指定字节数、读到某个分隔符等。
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "bufio" "fmt" "strings")func main() { data := "字段1;字段2;字段3;结束" reader := bufio.NewReader(strings.NewReader(data)) for { line, err := reader.ReadString(';') fmt.Print("段:", line) if err != nil { break // 到达结尾 } }}
ReadString 会包含分隔符,若要去掉可用 strings.TrimSuffix(line, “;”) 处理。
青泥AI
青泥学术AI写作辅助平台
302 查看详情
3. 使用 bufio.Writer 缓冲写入文件
频繁写文件会降低性能。使用 bufio.Writer 可将多次写操作合并成一次系统调用。
package mainimport ( "bufio" "os" "log")func main() { file, err := os.Create("output.txt") if err != nil { log.Fatal(err) } defer file.Close() writer := bufio.NewWriter(file) lines := []string{"苹果", "香蕉", "橙子"} for _, line := range lines { _, err := writer.WriteString(line + "\n") if err != nil { log.Fatal(err) } } // 必须调用 Flush,确保数据写入磁盘 err = writer.Flush() if err != nil { log.Fatal(err) }}
WriteString 不会立即写入文件,调用 Flush() 才真正输出。程序退出前务必刷新缓冲区。
4. 组合使用 Reader 和 Writer 处理文件
实际开发中常需读取一个文件并处理后写入另一个文件。
package mainimport ( "bufio" "os" "log")func main() { inputFile, err := os.Open("input.txt") if err != nil { log.Fatal(err) } defer inputFile.Close() outputFile, err := os.Create("output.txt") if err != nil { log.Fatal(err) } defer outputFile.Close() reader := bufio.NewReader(inputFile) writer := bufio.NewWriter(outputFile) defer writer.Flush() for { line, err := reader.ReadString('\n') if err != nil { // 写入最后一行(可能没有换行符) writer.WriteString(line) break } writer.WriteString("> " + line) // 添加前缀 }}
这种方式适合处理大文件,避免一次性加载全部内容到内存。
基本上就这些。合理使用 bufio 能让IO操作更高效。注意读写完成后关闭资源,写操作记得调用 Flush。不复杂但容易忽略。
以上就是Golang bufio缓冲读写操作示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1145453.html
微信扫一扫
支付宝扫一扫

