bufio包通过缓冲层减少系统调用以提升I/O性能;bufio.Reader用默认4KB缓冲区批量读取,支持自定义大小及高效按行/块读取;bufio.Scanner是安全简洁的按行扫描高层接口,默认单行上限64KB。
在 Go 中,
包通过为底层
和
添加缓冲层,显著减少系统调用次数,从而提升文件读写性能。直接使用
或
会频繁触发系统调用,而
、
、
能批量处理数据,是 I/O 性能优化的关键手段。
使用 bufio.Reader 高效读取大文件
在内存中维护一个固定大小的缓冲区(默认 4KB),每次从文件读取时优先从缓冲区获取,仅当缓冲区耗尽才发起系统调用。适合按行、按
字节
或按块读取场景。
创建时可自定义缓冲区大小:如
适配大文件,避免小缓冲导致频繁填充
推荐用
或
替代逐字节
,减少循环开销
注意:
会包含换行符,若需纯净行内容,可用
用 bufio.Scanner 安全读取文本行
是封装了
的高层接口,专为按行扫描设计,默认单行上限 64KB。它自动处理缓冲、换行识别和错误判断,代码更简洁安全。
设置更大行限制:调用
避免用
后直接保存引用——返回的是缓冲区内存切片,下一次
会覆盖;需用
拷贝
对纯文本日志、CSV 等按行处理场景,
比手动
更直观且不易出错
用 bufio.Writer 提升写入吞吐量
将多次小写入暂存于缓冲区,待缓冲满或显式
时才真正写入文件。相比每次
都触发系统调用,性能提升明显。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
立即学习
“
go语言免费学习笔记(深入)
”;
务必在写入完成后调用
,否则最后部分数据可能滞留缓冲区未落盘
写入大量小字符串时,先拼接再写入(如用
)通常比反复
更快,但若已用
,其缓冲本身已缓解该问题
结合
可同时写入多个目标(如文件 + 日志),
仍可作用于每个输出端
注意事项与常见陷阱
缓冲虽好,但不当使用反而引入问题。理解边界条件才能稳定发挥性能优势。
不适合二进制文件或无明确分隔符的数据流;此时应直接用
多个 goroutine 并发读写同一
实例需加锁,它们本身不保证并发安全
缓冲区大小并非越大越好:过大会增加内存占用和首次延迟;建议根据典型数据块大小(如日志行长、JSON 对象体积)调整,64KB~1MB 较常见
关闭文件前确保
已
,可 defer
,但要注意
可能返回 error,需检查
bufioio.Readerio.Writeros.File.ReadWritebufio.Scannerbufio.Readerbufio.Writerbufio.Readerbufio.NewReaderSize(file, 64*1024)ReadString('\n')ReadBytes('\n')ReadByte()ReadStringstrings.TrimSuffix(line, "\n")bufio.Scannerbufio.Readerscanner.Buffer(make([]byte, 64), 1 可支持最大 1MB 行(首参数为初始切片,次参数为最大容量)scanner.Bytes()Scan()append([]byte{}, scanner.Bytes()...)ScannerReaderbufio.WriterFlush()WriteStringw.Flush()strings.BuilderWriteStringWriterio.MultiWriterbufio.WriterScannerReader.Read()bufio.Reader/WriterWriterFlushw.Flush()Flush()