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

bufio包中的golang Writer.Write()与ioutil包中的WriteFile()比较,go,buffer,Go,Buffer,当我真的应该在ioutil上使用bufio包时,我感到困惑。例如,在写入文件或读取文件时。我有一个场景,其中有多个函数和API在同一数据上分阶段进行处理。我不确定在这种情况下选择bufio而不是ioutil是否有帮助?请建议 bufio包的意图是它声明的内容()-实现缓冲I/O。因此,对于写入,如果不刷新,数据将保留在缓冲区中,如示例所示。Bufio的Write还需要一个实现Writer接口的对象 而ioutil没有缓冲等功能-直接写入命名文件,而无需打开它,如: myData := []byt

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

bufio包的意图是它声明的内容()-实现缓冲I/O。因此,对于写入,如果不刷新,数据将保留在缓冲区中,如示例所示。Bufio的Write还需要一个实现Writer接口的对象

而ioutil没有缓冲等功能-直接写入命名文件,而无需打开它,如:

myData := []byte("Testing\ngo\n")
err := ioutil.WriteFile("/tmp/data1", myData, 0644)
因此,作为一个用例,如果您已经准备好了所有数据,并且需要一次性写入文件,那么ioutil是一个方便的选择

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

类似地,对于读取,对于ioutil,读取方法一次读取全部数据,这可能不适用于非常大的文件,但在某些其他情况下可能是可取的/可接受的。bufio为您提供了方法,使您能够更好地控制要读取的数据量,但它提供了有用的方法,可以逐行读取数据,并通过其他标记进行拆分等


这里有一个演示使用这两个包进行写入的示例。

bufio包的意图是它所声明的内容()-实现缓冲I/O。因此,对于写入,如果不刷新,数据将保留在缓冲区中,如示例所示。Bufio的Write还需要一个实现Writer接口的对象

而ioutil没有缓冲等功能-直接写入命名文件,而无需打开它,如:

myData := []byte("Testing\ngo\n")
err := ioutil.WriteFile("/tmp/data1", myData, 0644)
因此,作为一个用例,如果您已经准备好了所有数据,并且需要一次性写入文件,那么ioutil是一个方便的选择

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

类似地,对于读取,对于ioutil,读取方法一次读取全部数据,这可能不适用于非常大的文件,但在某些其他情况下可能是可取的/可接受的。bufio为您提供了方法,使您能够更好地控制要读取的数据量,但它提供了有用的方法,可以逐行读取数据,并通过其他标记进行拆分等


这里有一个演示如何使用这两个包进行写操作的示例。

如果您准备好了所有数据,那么WriteFile更易于使用(高级API)。作者更一般。例如,它是一个接口,允许您

  • 不仅要写入文件,还要写入套接字、管道、bytes.Buffer或支持此接口的任何其他内容
  • 只写一段数据,然后再写另一段
  • 使用高级函数,如fmt.Fprintf、json.Encoder.Encode、
  • 在将数据放入其他写入程序之前修改数据(base64,[un]压缩数据)
  • 使用非常专用的工具,如cmd.Command.StdinPipe、io.MultiWriter

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

如果你准备好了所有的数据,这个WriteFile更容易使用(高级API)。作者更一般。例如,它是一个接口,允许您

  • 不仅要写入文件,还要写入套接字、管道、bytes.Buffer或支持此接口的任何其他内容
  • 只写一段数据,然后再写另一段
  • 使用高级函数,如fmt.Fprintf、json.Encoder.Encode、
  • 在将数据放入其他写入程序之前修改数据(base64,[un]压缩数据)
  • 使用非常专用的工具,如cmd.Command.StdinPipe、io.MultiWriter

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

ioutil是某些特定i/o操作的快捷方式。例如,ReadFile将整个文件读取到内存中。Ioutil还处理打开/关闭/创建等文件过程。如果您想要更多的控制,那么应该使用io/bufio来降低成本。ioutil是某些特定i/o操作的快捷方式。例如,ReadFile将整个文件读取到内存中。Ioutil还处理打开/关闭/创建等文件过程。如果你想得到更多的控制,你应该降低io/bufio的控制力,我差点忘了。。Ben Johnson的文章中有很好的基本解释,我差点忘了。。本·约翰逊的文章中有很好的基本解释