Golang 中的 Bufio 包詳解之Bufio.Writer
使用 Golang 進行寫入文件操作時,如果每次都調用系統函數寫入磁盤,在很多場景下都會影響程序的性能。bufio 包中的 bufio.Writer 提供了帶緩沖的寫操作,進行寫操作時,數據會先被寫入到一個緩沖區中,當達到一定條件,比如流緩沖區滿了或刷新緩沖區時,再調用系統函數寫入磁盤。
bufio.Writer
bufio.Writer 是一個帶有緩沖區的 io.Writer 接口的實現,提供了一系列方法來幫助高效寫入數據。通過對寫入數據進行緩存,可以提高寫入效率,同時減少系統調用次數,從而提高程序性能。結構體定義和對應的方法如下:
type Writer struct {
err error
buf []byte
n int
wr io.Writer
}
下面是 bufio.Writer 提供的一些主要方法:
- func (b *Writer) Write(p []byte) (nn int, err error),將字節切片 p 的內容寫入緩存中。
- func (b *Writer) WriteString(s string) (int, error),寫入一個字符串,返回寫入的字節數和可能發生的的錯誤。
- func (b *Writer) WriteByte(c byte) error,寫入單個字節。
- func (b *Writer) WriteRune(r rune) (size int, err error),WriteRune寫入一個unicode碼值,返回寫入的字節數和可能發生的錯誤。
- func (b *Writer) Flush() error,將緩存中的所有數據寫入底層的 io.Writer 對象中。
- func (b *Writer) Available() int,返回緩存中還可以寫入的字節數。
- func (b *Writer) Buffered() int,返回緩存中已經寫入但還沒有被刷新到底層的 io.Writer 中的字節數。
- func (b *Writer) Reset(w io.Writer),將緩存重置為空,并將底層的 io.Writer 對象設置為 w。
- func (b *Writer) Size() int,返回底層緩沖區的字節數。
其他方法就不一一說明了,最好自己去看去使用去體會。
使用示例
簡單使用示例如下:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create(" file.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("路多辛的所思所想!\n")
writer.Flush()
}
使用 bufio.Writer 寫入了字符串 "路多辛的所思所想!",通過實例化一個 bufio.Writer 對象并調用該對象的 WriteString 方法來完成寫入,最后使用 Flush 方法將緩存中的數據刷新到底層的 io.Writer 對象中。
小結
bufio.Writer 提供了一個帶有緩沖區的 io.Writer 接口的實現,可以減少系統調用的次數,提高寫入性能。