一、創建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/zh-tw/n/369064.html