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

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


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 文档根本没有告诉我什么时候使用它,什么时候不使用它。


MMTTMM
浏览 87回答 1
1回答

互换的青春

不要在这种情况下使用 bufio。当给定*os.File目的地时,io.Copy 通过调用复制文件dest.ReadFrom(src)。如果源也是*os.File,则 ReadFrom 调用操作系统在某些系统上执行复制。在 ReadFrom 和其他优化不可用的情况下,将 bufio 用于 io.Copy 源和目标仍然没有任何好处。io.Copy 缓冲区大小为 32k,bufio 默认缓冲区大小为 4K。因为 bufio 类型在传递一个更大的缓冲区时会绕过它们自己的缓冲区,所以 bufio 类型除了分配一些额外的内存外什么都不做。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go