Go语言的bufio
包为I/O操作提供了缓冲机制,通过缓冲可以减少对磁盘(或网络)的直接读写次数,从而提高I/O操作的效率。bufio
包主要提供了Reader
和Writer
两种类型,它们分别用于高效地读取和写入数据。
bufio
包提供的功能:
缓冲读取:
bufio.Reader
提供了一系列的方法用于高效地读取数据,如按行读取(ReadLine
)、按字节读取(ReadByte
)、按指定分隔符读取(ReadString
)等。缓冲写入:
bufio.Writer
则提供了缓冲写入的机制,通过Write
方法写入的数据会先存储在内部缓冲区中,直到缓冲区满或显式调用Flush
方法时,数据才会被写入到底层的io.Writer
接口实现(如文件)。Scanner:
bufio.Scanner
类型提供了一个简单的接口来扫描输入分割成行,这对于逐行读取文件内容特别有用。
如何使用bufio
来高效地读写文件:
读取文件:
使用bufio.NewReader
函数可以创建一个*bufio.Reader
实例,然后使用它来读取文件。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n') // 按行读取
if err != nil {
break
}
fmt.Print(line)
}
if err != nil && err != io.EOF {
panic(err)
}
}
写入文件:
使用bufio.NewWriter
函数可以创建一个*bufio.Writer
实例,然后使用它来写入文件。注意,在完成所有写入后,应该调用Flush
方法确保所有缓冲的数据都被写入到底层io.Writer
接口实现中,或者等待Close
方法被调用时自动Flush
。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
fmt.Fprintln(writer, "Hello, Go!") // 写入一行数据
}
// 确保所有数据都被写入到底层Writer中
if err := writer.Flush(); err != nil {
panic(err)
}
}
通过使用bufio
包提供的缓冲读取和写入功能,Go程序能够更高效地处理I/O操作,尤其是对于大文件或网络数据的读写。