Bufio包

简介

  • 与I/O操作强相关的代码包,bufio是“buffered I/O”的缩写
  • bufio包中的数据类型主要有: Reader、Scanner、Writer和ReadWriter
  • bufio包中用于初始化Reader值的函数
  1. NewReader 返回 *bufio.Reader类型的值 (默认尺寸是4096个字节)
  2. NewReaderSize 返回 *bufio.Reader类型的值(默认尺寸是4096个字节)

包级私有fill方法

  • fill方法会先检查其所属值的已读计数,若这个计数不大于0
  1. 缓冲区中字节是全新的
  2. 缓冲区刚被压缩过

缓冲区的压缩过程:(**fill方法**只要在开始时发现其所属值的已读计数大于0,就会对缓冲区进行一次压缩)

  1. 把缓冲区中在[已读计数, 已写计数)范围内的所有元素值(或者字节)都依次拷贝到缓冲区的头部
  2. fill方法把已读计数设置为0,已读计数设置为 原已写计数 - 原已写计数


bufio.Writer类型值

bufio.Writer类型有哪些字段

  • err:error 类型的字段
  • buf: []byte 类型的字段,代表缓冲区
  • n: int 类型的字段,代表对缓冲区进行下一次写入时的开始索引
  • wr: io.Writer类型的字段,代表底层写入器

Flush 方法

  • bufio.Writer类型有一个名为Flush方法,它的主要功能是把相应缓冲区中暂存的数据写入底层写入器中
  • 通常情况下,只要缓冲区中的可写空间无法容纳需要写入的新数据,Flush方法就一定会被调用
  • 强烈建议在所有数据写入Writer值后,在调用一次Flush方法

bufio.Reader类型值

Reader值拥有的读方法

  • Peek方法: 读取缓冲区中的数据但是不改变已读计数的值
  • ReadSlice方法: 在缓冲区的未读部分中寻找给定的分隔符,并在必要时对缓冲区进行填充,如果填充后仍然没有找到分隔符,那么该方法就会把整个缓冲区作为第一结果值返回
  1. ReadSlice方法会现在缓冲区的未读部分中寻找分割符
  2. 若未找到,并且缓冲区未满,该方法会先调用fill方法对缓冲区进行填充,然后再次寻找
  3. 如果缓冲区已被填满,但仍未找到分隔符,该方法会将整个缓冲区中的数据作为第一结果值返回
  • ReadBytes方法:对ReadSlice的二层封装,一次次的通过ReadSlice填充缓冲区直至寻找到分割符否则将一直进行下去