bufio 包中的 golang Writer.Write() 与 ioutil 包中的 WriteFile()

标签 go buffer

当我实际上应该在 ioutil 上使用 bufio 包时,我很困惑。例如在写入文件或读取文件时。我有这样的场景,其中有多个函数和 API 逐阶段处理相同的数据。我不确定在这种情况下选择 bufio 而不是 ioutil 是否有帮助?请建议。

最佳答案

bufio 包的目的如其所述 (https://golang.org/pkg/bufio/) - 实现缓冲 I/O。因此对于写入,如果不刷新,数据将保留在缓冲区中,如 this 中所示。例子。 Bufio 的 Write 还需要一个实现 Writer 接口(interface)的对象。

而 ioutil 没有缓冲等 - 您直接写入命名文件,而不必打开它,例如:

myData := []byte("Testing\ngo\n")
err := ioutil.WriteFile("/tmp/data1", myData, 0644)

因此,作为一个用例,如果您已准备好所有数据并需要写入文件 - 只需一次,那么 ioutil 是一个方便的选择。

但是,如果您的数据是随着代码的进行而生成的,那么 bufio 是更合适的选择,您可以根据需要多次使用 WriteString,然后最后调用 flush。

与读取类似,对于 ioutil,Read 方法一次读取所有数据,这可能不适合非常大的文件,但在某些其他情况下可能是可取/可接受的。 bufio 为您提供了可以更好地控制要读取的数据量的方法,它还提供了有用的方法来逐行读取、按其他标记拆分等。

这是一个 program在 playground 上说明了使用这两个包进行写入。

关于bufio 包中的 golang Writer.Write() 与 ioutil 包中的 WriteFile(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46841089/

相关文章:

java - 了解 netty channel 缓冲区和水印

go - 使用什么系统调用来获取某些 RTF_* 标志的值

go - Serf 客户端无法连接到本地运行的 RPC 客户端

go - 如何从结构中指定我们想要使用的字段?

json - Golang json.Marshal() 忽略 ByteArray 字段中的 omitempty

reflection - 从 Golang 类型中提取未导出字段的正确方法是什么?

python - 通过套接字发送图像时遇到问题

android - 在 python 3.4 中编码字符串

c - 从c中的fread()形式读取缓冲区数据

C 缓冲区溢出显示消息(使用 Ubuntu 和 DDD)