来自bufio包的golang Writer.Write()和来自ioutil包的WriteFile()

时间:2017-10-20 01:21:58

标签: go buffer

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

2 个答案:

答案 0 :(得分:0)

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

而ioutil没有缓冲等等 - 你直接写入指定的文件,而不必打开它,如:

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

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

但是如果你的代码进展时生成了数据,那么bufio是一个更合适的选项,你可以根据需要多次使用WriteString,然后最后调用flush。

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

这里是操场上的program,用于说明使用这两个包进行写入。

答案 1 :(得分:0)

如果您准备好了所有数据,那么WriteFile更易于使用(高级API)。 io.Writer更通用。它是接口,允许你举例

  • 不仅写入文件,还写入socket,pipe,bytes.Buffer或其他支持此接口的内容
  • 只写一段数据,然后写下另一篇
  • 使用高级函数,如fmt.Fprintf,json.Encoder.Encode,
  • 在将数据放到另一个Writer(base64,[un]压缩它们)之前修改数据
  • 使用非常专业的工具,例如cmd.Command.StdinPipe,io.MultiWriter。

如果您不需要这样的东西,WriteFile更容易阅读。如果你需要更复杂的东西,你必须使用io.Writer。但代码要长得多 - 你必须打开一个文件(+检查错误)并关闭它。