美文网首页
bufio.Bufio 代码阅读

bufio.Bufio 代码阅读

作者: wayyyy | 来源:发表于2022-04-18 05:04 被阅读0次

    bufio 实现了有缓冲的I/O,它包装了一个io.Reader 或 io.Writer 接口对象

    bufio.png
    缓冲区状态
    • 缓冲区为空
      缓冲区为空的状态本质上是指没有内容可读。即为r == w。其中最简单的就是r和w都等于0

      或者缓冲区中有内容,但已经都被读取走了,即r和w相等

      在这种状态下,当再需要读取内容时,会首先将r和w都置为0,然后从文件中加载新的数据填充到缓冲区中以供下次调用方读取。

    • 缓冲区为非空的状态
      这种状态是指在缓冲区中有可读的内容,即r != w && (w-r) < len(buf)
      r != w 说明buf[r:w]这段内容还没被调用方读取。(w-r) < len(buf) 说明buf不是满的状态,还有空间可以继续填充内容。在这种状态下,当程序执行读操作时,会直接从缓冲区中读取。如下图:

    • 缓冲区满
      还有最后一种缓冲区状态,即缓冲区满,即(w-r) >= len(buf),如果要满足上述公式,只有一种情况,即 r=0,表示还没有从缓冲区读走任何内容。w=len(buf),表示从文件中读取的内容已经填满了整个缓冲区。该示例中为w=10,即表示没有任何空闲的空间。如下图所示:

    Reader 对象
    type Reader struct {
        buf          []byte
        rd           io.Reader // reader provided by the client
        r, w         int       // buf read and write positions
        err          error
        lastByte     int // last byte read for UnreadByte; -1 means invalid
        lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
    }
    
    • 创建
      defaultBufSize = 4096
      
      const minReadBufferSize = 16
      
      func NewReader(rd io.Reader) *Reader {
          return NewReaderSize(rd, defaultBufSize)
      }
      
      func NewReaderSize(rd io.Reader, size int) *Reader {
          // Is it already a Reader ?
          b, ok := rd.(*Reader)
          if ok && len(b.buf) >= size {
              return b
          }
          if size < minReadBufferSize {
              size = minReadBufferSize
          }
          r := new(Reader)
          r.reset(make([]byte, size), rd)
          return r
      }
      
      func (b *Reader) reset(buf []byte, r io.Reader) {
          *b = Reader{
              buf:          buf,
              rd:           r,
              lastByte:     -1,
              lastRuneSize: -1,
          }
      }
      
    • 读取
    Writer 对象

    相关文章

      网友评论

          本文标题:bufio.Bufio 代码阅读

          本文链接:https://www.haomeiwen.com/subject/clputrtx.html