登录
首页 >  Golang >  Go问答

为什么在复制文件时会选择使用bufio Reader/Writer?

来源:stackoverflow

时间:2024-02-20 10:36:25 277浏览 收藏

golang学习网今天将给大家带来《为什么在复制文件时会选择使用bufio Reader/Writer?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

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 文档根本没有告诉我何时使用它、何时不使用它。


正确答案


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

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

好了,本文到此结束,带大家了解了《为什么在复制文件时会选择使用bufio Reader/Writer?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>