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

复制实际文件时是否有使用 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贡献1797条经验 获得超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
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

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