导读:本文是 Go 系列的第三篇文章,我将介绍三种最流行的复制文件的方法。                   

本文字数:4840,阅读时长大约:5分钟

本文是 Go 系列的第三篇文章,我将介绍三种最流行的复制文件的方法。

本文将介绍展示如何使用Go 编程语言golang.org来复制文件。在 Go 中复制文件的方法有很多,我只介绍三种最常见的:使用 Go 库中的 函数调用、一次读取输入文件并将其写入另一个文件,以及使用缓冲区一块块地复制文件。

方法一:使用 io.Copy()

第一种方法就是使用 Go 标准库的 函数。你可以在 函数的代码中找到它的实现逻辑,如下所示:

首先,上述代码做了两个判断,以便确定它可以被打开读取:一是判断将要复制的文件是否存在(),二是判断它是否为常规文件()。剩下的所有工作都由 这行代码来完成。 函数执行结束后,会返回复制的字节数和复制过程中发生的第一条错误消息。在 Go 中,如果没有错误消息,错误变量的值就为 。

你可以在io 包golang.org的文档页面了解有关 函数的更多信息。

运行 将产生以下输出:

这个方法已经非常简单了,不过它没有为开发者提供灵活性。这并不总是一件坏事,但是,有些时候,开发者可能会需要/想要告诉程序该如何读取文件。

方法二:使用 ioutil.WriteFile() 和 ioutil.ReadFile()

复制文件的第二种方法是使用 和 函数。第一个函数用于将整个文件的内容,一次性地读入到某个内存中的字节切片里;第二个函数则用于将字节切片的内容写入到一个磁盘文件中。

实现代码如下:

上述代码包括了两个 代码块(嗯,用 Go 写程序就是这样的),程序的实际功能其实体现在 和 这两行代码中。

运行 ,你会得到下面的输出:

请注意,虽然这种方法能够实现文件复制,但它在复制大文件时的效率可能不高。这是因为当文件很大时, 返回的字节切片会很大。

方法三:使用 os.Read() 和 os.Write()

在 Go 中复制文件的第三种方法就是下面要介绍的 。它接受三个参数:输入文件名、输出文件名和缓冲区大小。

最重要的部分位于以下 循环中,你可以在 函数中找到它,如下所示:

该方法使用 将输入文件的一小部分读入名为 的缓冲区,然后使用 将该缓冲区的内容写入文件。当读取出错或到达文件末尾()时,复制过程将停止。

运行 ,你会得到下面的输出:

在接下来的基准测试中,你会发现,缓冲区的大小极大地影响了 的性能。

运行基准测试

在本文的最后一部分,我将尝试比较这三个程序以及 在不同缓冲区大小下的性能(使用 命令行工具)。

以下输出显示了复制 500MB 大小的文件时,、 和 的性能对比:

我们可以看出,这三个程序的性能非常接近,这意味着 Go 标准库函数的实现非常聪明、经过了充分优化。

现在,让我们测试一下缓冲区大小对 的性能有什么影响吧!执行 ,并分别指定缓冲区大小为 10、20 和 1000 字节,在一台运行很快的机器上复制 500MB 文件,得到的结果如下:

我们可以发现,缓冲区越大, 运行得就越快,这或多或少是符合预期的。此外,使用小于 20 字节的缓冲区来复制大文件会非常缓慢,应该避免。

你可以在GitHubgithub.com找到 、 和 的 Go 代码。

如果你有任何问题或反馈,请在(原文)下方发表评论或在Twittertwitter.com上与我(原作者)联系。

via:https://opensource.com/article/18/6/copying-files-go

本文由LCTT原创编译,Linux中国荣誉推出

LCTT 译者 :六开箱

翻译: 68.0 篇

|

贡献: 77 天

2022-03-16

2022-05-31

https://linux.cn/lctt/lkxed

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “转载:公众号名称”,

我们将为您添加白名单,授权“转载文章时可以修改”。