我一直在尝试自己学习 Go,但我一直难以尝试读取和写入普通文件。
我可以得到 inFile, _ := os.Open(INFILE, 0, 0)
,但实际上获取文件的内容没有意义,因为读取函数需要 []byte
作为参数。
func (file *File) Read(b []byte) (n int, err Error)
原文由 Seth Hoenig 发布,翻译遵循 CC BY-SA 4.0 许可协议
我一直在尝试自己学习 Go,但我一直难以尝试读取和写入普通文件。
我可以得到 inFile, _ := os.Open(INFILE, 0, 0)
,但实际上获取文件的内容没有意义,因为读取函数需要 []byte
作为参数。
func (file *File) Read(b []byte) (n int, err Error)
原文由 Seth Hoenig 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
1 回答4.9k 阅读
让我们制作一个兼容 Go 1 的列表,列出在 Go 中读取和写入文件的所有方法。
因为文件 API 最近发生了变化,大多数其他答案不适用于 Go 1。他们还错过了
bufio
这很重要恕我直言。在以下示例中,我通过读取文件并写入目标文件来复制文件。
从基础开始
在这里我使用
os.Open
和os.Create
它们是os.OpenFile
的方便包装器。我们通常不需要直接调用OpenFile
。注意处理 EOF。
Read
尝试在每次调用时填充buf
,并返回io.EOF
作为错误,如果它在这样做时到达文件末尾。在这种情况下buf
仍将保存数据。随后调用Read
返回零作为读取的字节数和相同的io.EOF
作为错误。任何其他错误都会导致恐慌。使用
bufio
bufio
在这里只是充当缓冲区,因为我们与数据没有太多关系。在大多数其他情况下(特别是文本文件)bufio
非常有用,它为我们提供了 一个很好的 API ,可以轻松灵活地读写,同时它在后台处理缓冲。注意: 以下代码适用于较旧的 Go 版本(Go 1.15 及之前)。事情变了。对于新方法,请查看 此答案。
使用
ioutil
非常简单!但是只有当你确定你不是在处理大文件时才使用它。