一、创建bufio实例
bufio是Go语言标准库中用于缓存I/O的包。当程序频繁进行I/O读写操作时,使用bufio包可以减少系统调用次数,大大提高程序性能。
要使用bufio包,首先需要创建bufio的实例。可以通过传入io.Reader或io.Writer接口创建一个新的bufio.Reader或bufio.Writer并返回。
package main import ( "bufio" "os" ) func main() { file, _ := os.Open("input.txt") defer file.Close() reader := bufio.NewReader(file) // ... }
代码中我们使用os包打开了名为input.txt的文件,并使用bufio.NewReader(file)创建了一个新的bufio.Reader。
二、读取文件
bufio包提供了多个读取文件的函数,其中最常见的是ReadLine、ReadBytes和ReadString三个函数。ReadLine和ReadBytes函数都支持读取指定分隔符之前的数据,而ReadString函数则读取指定长度或直到碰到指定分隔符为止。
package main import ( "bufio" "fmt" "os" ) func main() { file, _ := os.Open("input.txt") defer file.Close() reader := bufio.NewReader(file) // read line by line for { line, _, err := reader.ReadLine() if err != nil { break } fmt.Println(string(line)) } // read string by delimiter delimitedData, _ := reader.ReadString('\n') fmt.Println(delimitedData) }
代码中我们使用了bufio包中常用的两个读取数据的函数:ReadLine和ReadString。ReadLine函数读取文件中的每一行,并将其存储在line这个byte切片中。如果读取完毕,返回的err则不为空;而ReadString函数则读取文件中指定分隔符之前的内容,并将其返回。
三、写入文件
类似于读取数据,bufio包也提供了bufio.Writer来支持缓存写入操作。使用bufio.Writer可以减少实际写入文件次数,提高效率。
package main import ( "bufio" "os" ) func main() { // create file for writing file, _ := os.Create("output.txt") defer file.Close() // create bufio.Writer writer := bufio.NewWriter(file) // write to file writer.WriteString("Hello, world!\n") writer.Write([]byte("This is a test.")) // flush buffer to file writer.Flush() }
代码中我们使用bufio.NewWriter创建了一个新的bufio.Writer,并使用WriteString和Write函数向文件中写入数据,最后使用Flush函数将缓存内容写入到文件中。
四、缓存设置
bufio包提供了几个常用的缓存设置,以便开发人员根据实际需要进行调整。
在创建bufio实例时,可以为bufio.Reader和bufio.Writer分别设置缓存大小,以满足不同情况下的需求。
// create bufio.Reader with 1024 byte buffer r := bufio.NewReaderSize(reader, 1024) // create bufio.Writer with 4096 byte buffer w := bufio.NewWriterSize(writer, 4096)
另外可以通过bufio.Writer提供的函数Flush和Available,分别用于将缓存刷写到磁盘和获取缓存中的剩余字节数。
// flush buffer to file writer.Flush() // get remaining buffer size remaining := writer.Available()
五、错误处理
在实际使用中,我们需要对bufio包中的部分函数的错误进行处理。通常使用for循环和break语句结合处理io.EOF这个错误,直到读取完毕为止。
file, _ := os.Open("input.txt") defer file.Close() reader := bufio.NewReader(file) for { line, _, err := reader.ReadLine() if err != nil { if err == io.EOF { break } fmt.Println(err) os.Exit(1) } fmt.Println(string(line)) }
在上述代码中,我们使用了for循环和break语句结合处理io.EOF错误,如果出现其他错误,则将错误信息输出并强制退出程序。
原创文章,作者:EJNOG,如若转载,请注明出处:https://www.506064.com/n/369064.html