bufio 带缓冲IO操作

Go语言标准库中的bufio包提供了带缓冲的IO操作,bufio是对基础IO操作的封装,它提供了内置的缓冲区,使用缓冲区可以减少大文件读写时的频繁系统调用,达到提高系统的IO吞吐量的目的。bufio包中定义了两个重要的类型bufio.Readerbufio.Writer,分别用于带缓冲的读取和写入操作,这篇笔记我们介绍bufio的使用。

使用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.Readerbufio.Writer对象,分别用于读取和写入操作,它们的参数是io.Readerio.Writer接口类型,这类似于Java的IO流的设计,都使用了装饰器设计模式。在读取和写入操作中,我们使用了bufio.Readerbufio.Writer提供的Read()Write()方法,这两个方法分别用于读取和写入数据。

注意:上面代码仅用于演示bufio的用法,实际开发中如果想要实现类似复制文件的功能,推荐使用io.Copy()函数。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap