Golang 中的 Bufio 包详解之常用函数(Golang Bufio 包深度解析:常用函数详解与应用实例)
原创
一、Bufio 包简介
在 Golang 中,标准库的 "bufio" 包提供了对缓冲读取和写入的赞成。它提供了 Reader 和 Writer 类型的结构体,这些结构体封装了缓冲机制,令读写操作更加高效。本文将详细介绍 "bufio" 包中的常用函数及其应用实例。
二、Reader 类型常用函数
1. Read 方法
Read 方法从 Reader 中读取数据到切片中,返回读取的字节数和大概遇到的谬误。
func (b *Reader) Read(p []byte) (n int, err error)
示例代码:
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)
buffer := make([]byte, 10)
n, err := reader.Read(buffer)
if err != nil {
panic(err)
}
fmt.Println(string(buffer[:n]))
}
2. ReadString 方法
ReadString 方法从 Reader 中读取数据直到遇到指定的分隔符,并返回包含分隔符之前的字符串。
func (b *Reader) ReadString(delimiter byte) (line string, err error)
示例代码:
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)
line, err := reader.ReadString(' ')
if err != nil {
panic(err)
}
fmt.Println(line)
}
3. ReadBytes 方法
ReadBytes 方法从 Reader 中读取数据直到遇到指定的分隔符,并返回包含分隔符之前的字节切片。
func (b *Reader) ReadBytes(delimiter byte) (line []byte, err error)
示例代码:
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)
line, err := reader.ReadBytes(' ')
if err != nil {
panic(err)
}
fmt.Println(string(line))
}
三、Writer 类型常用函数
1. Write 方法
Write 方法将切片中的数据写入 Writer。
func (b *Writer) Write(p []byte) (nn int, err error)
示例代码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
n, err := writer.Write([]byte("Hello, world! "))
if err != nil {
panic(err)
}
fmt.Println("Wrote", n, "bytes")
}
2. WriteString 方法
WriteString 方法将字符串写入 Writer。
func (b *Writer) WriteString(s string) (nn int, err error)
示例代码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
n, err := writer.WriteString("Hello, world! ")
if err != nil {
panic(err)
}
fmt.Println("Wrote", n, "bytes")
}
3. Flush 方法
Flush 方法将缓冲区中的数据写入底层写入器。
func (b *Writer) Flush() error
示例代码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
n, err := writer.WriteString("Hello, world! ")
if err != nil {
panic(err)
}
fmt.Println("Wrote", n, "bytes")
err = writer.Flush()
if err != nil {
panic(err)
}
fmt.Println("Flushed")
}
四、综合应用实例
下面是一个综合应用实例,它使用 bufio 包来实现一个易懂的文件复制功能。
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
srcFile, err := os.Open("source.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
dstFile, err := os.Create("destination.txt")
if err != nil {
panic(err)
}
defer dstFile.Close()
srcReader := bufio.NewReader(srcFile)
dstWriter := bufio.NewWriter(dstFile)
buffer := make([]byte, 1024)
for {
n, err := srcReader.Read(buffer)
if err != nil && err != io.EOF {
panic(err)
}
if n == 0 {
break
}
nn, err := dstWriter.Write(buffer[:n])
if err != nil {
panic(err)
}
if nn != n {
panic("Mismatched write size")
}
}
err = dstWriter.Flush()
if err != nil {
panic(err)
}
fmt.Println("File copy completed successfully.")
}
五、总结
本文详细介绍了 Golang 中 "bufio" 包的常用函数,并通过示例代码展示了怎样使用这些函数。通过这些函数,我们可以更高效地进行文件的读写操作,尤其是在处理大量数据时,使用缓冲可以显著减成本时间性能。