为了账号安全,请及时绑定邮箱和手机立即绑定

复制实际文件时是否有使用 bufio Reader/Writer 的原因?

复制实际文件时是否有使用 bufio Reader/Writer 的原因?

Go
MMTTMM 2022-11-23 19:18:29

我有一个简单的代码,可以在两个实际文件之间进行复制。(它们在同一个磁盘上,但不确定是否相关。)


func copy(inPath, outPath string) {

    inFile, err := os.Open(inPath)

    if err != nil {

        return fmt.Errorf("cannot open input file on path %q: %w", inPath, err)

    }

    defer inFile.Close()


    outFile, err := os.Create(outPath)

    if err != nil {

        return fmt.Errorf("cannot create output file on path %q: %w", outPath, err)

    }

    defer outFile()


    if _, err := io.Copy(inFile, outFile); err != nil {

        return fmt.Errorf("cannot copy file %q to %q: %w", inPath, outPath, err)

    }

}

我现在不确定,如果我应该或不应该使用bufio读者或作家或两者兼而有之。


也就是说,如果我应该做类似的事情


func copy(inPath, outPath string) {

    inFile, err := os.Open(inPath)

    if err != nil {

        return fmt.Errorf("cannot open input file on path %q: %w", inPath, err)

    }

    defer inFile.Close()


    outFile, err := os.Create(outPath)

    if err != nil {

        return fmt.Errorf("cannot create output file on path %q: %w", outPath, err)

    }

    defer outFile()


    if _, err := io.Copy(bufio.NewWriter(outFile), bufio.NewReader(inFile)); err != nil {

        return fmt.Errorf("cannot copy file %q to %q: %w", inPath, outPath, err)

    }

}

bufio 文档根本没有告诉我什么时候使用它,什么时候不使用它。


查看完整描述

1 回答

?
互换的青春

TA贡献1516条经验 获得超6个赞

不要在这种情况下使用 bufio。当给定*os.File目的地时,io.Copy 通过调用复制文件dest.ReadFrom(src)。如果源也是*os.File,则 ReadFrom 调用操作系统在某些系统上执行复制。

在 ReadFrom 和其他优化不可用的情况下,将 bufio 用于 io.Copy 源和目标仍然没有任何好处。io.Copy 缓冲区大小为 32k,bufio 默认缓冲区大小为 4K。因为 bufio 类型在传递一个更大的缓冲区时会绕过它们自己的缓冲区,所以 bufio 类型除了分配一些额外的内存外什么都不做。


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信