Go语言标准库中的bufio
包提供了带缓冲的IO操作,bufio
是对基础IO操作的封装,它提供了内置的缓冲区,使用缓冲区可以减少大文件读写时的频繁系统调用,达到提高系统的IO吞吐量的目的。bufio
包中定义了两个重要的类型bufio.Reader
和bufio.Writer
,分别用于带缓冲的读取和写入操作,这篇笔记我们介绍bufio
的使用。
下面例子中,我们使用bufio
读取一个二进制文件,然后又将数据写入另一个文件。
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 打开源文件
srcFile, err := os.Open("C:\\Users\\HUAWEI\\src.pdf")
if err != nil {
fmt.Println(err)
return
}
// 关闭源文件
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
return
}
}(srcFile)
// 创建目标文件
dstFile, err := os.Create("C:\\Users\\HUAWEI\\target.pdf")
if err != nil {
fmt.Println(err)
return
}
// 关闭目标文件
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
return
}
}(dstFile)
// 读取数据和写入数据
buffer := make([]byte, 4096)
reader := bufio.NewReader(srcFile)
writer := bufio.NewWriter(dstFile)
for {
n, err := reader.Read(buffer)
if err != nil {
if err == io.EOF {
break
} else {
fmt.Println(err)
return
}
}
if _, err = writer.Write(buffer[:n]); err != nil {
fmt.Println(err)
return
}
}
if err = writer.Flush(); err != nil {
fmt.Println(err)
return
}
}
我们可以看到,代码中我们使用bufio.NewReader()
和bufio.NewWriter()
创建了bufio.Reader
和bufio.Writer
对象,分别用于读取和写入操作,它们的参数是io.Reader
和io.Writer
接口类型,这类似于Java的IO流的设计,都使用了装饰器设计模式。在读取和写入操作中,我们使用了bufio.Reader
和bufio.Writer
提供的Read()
和Write()
方法,这两个方法分别用于读取和写入数据。
注意:上面代码仅用于演示bufio
的用法,实际开发中如果想要实现类似复制文件的功能,推荐使用io.Copy()
函数。