Go圣经-学习笔记入门bufio.Writer

﹥>﹥吖頭↗ 提交于 2019-11-30 09:55:30

上一篇 Go圣经-学习笔记入门bufio.Scanner

下一篇 Go圣经-学习笔记之程序结构

bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。

bufio.Writer使用

bufio标准库中的Writer提供的方法列表

type Writer struct {
    err error
    buf []byte
    n   int
    wr  io.Writer
}

// 实例化bufio.Writer, 实例化是会直接分配大小为len(w.buf)大小的内存空间,Writer.n表示内存缓冲区已经存放的字节大小
func NewWriter(w io.Writer) *Writer
func NewWriterSize(w io.Writer, size int) *Writer

// 表示可用的内存缓冲区大小len(b.buf)-n
func (b *Writer) Avaliable() int

// 表示已使用的内存缓冲区大小b.n
func (b *Writer) Buffered() int

// 这个首字母大写,表示用户可以手动触发内存缓冲区的数据,回写到wr.Write所指定的地方,一般为磁盘IO回写
func (b *Writer) Flush() error

// bufio.Writer把数据写到缓冲区挺有意思的。
// 开发者可以阅读源码了解一下。我举第二个方法Write([]byte)
func (b *Writer) ReadFrom(r io.Reader) (int64, error)
func (b *Writer) Write(p []byte) (int, error)
func (b *Writer) WriteByte(c byte) error
func (b *Writer) WriteRune(r rune) (int, error)
func (b *Writer) WriteString(s string) (int, error)

对于func (b *Writer) Write(p []byte) (int, error)方法的正确理解:

  1. 如果内存缓冲区剩余空间小于len(p),分两种情况讨论:
    • 如果当前内存缓冲区为空,则直接把p数据写入到磁盘IO,b.wr.Write(p);
    • 如果当前内存缓冲区不空,则首先把缓冲区填满,然后先把内存缓冲区的数据进行一次磁盘IO回写操作,之后内存缓冲区可用大小有是len(Writer.buf)长度了,这时又分两种情况讨论:第一种:如果剩余要处理的p数据小于内存缓冲区的大小, 则把剩余数据p写入到内存缓冲区;第二种:如果剩余要处理的p数据大于等于内存缓冲区,则没必要缓冲了,直接整体一次回写到磁盘
  2. 如果内存缓冲区剩余空间大于等于len(p), 则先把数据暂存到缓冲区,减少磁盘IO。

总结:bufio的Reader和Writer操作一般适用于磁盘IO的读写场景。同时了解标准库的实现, 可以提高自己的编程思维。标准库bufio确实写得很有意思。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!