美文网首页
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 代码阅读

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

  • 阅读代码

    2018-05-06 阅读代码 通读代码,做好标记: 函数以及函数的功能。 每个变量的初始赋值。 每个在程序的各个...

  • 阅读代码

    今天想准备3D实验的训练数据集,但是之前看过的代码已经记不清了。这样的问题一直存在,别人的代码啃过之后以为懂了,过...

  • 阅读代码

    看代码是很让人头大的事情,尤其是篇幅很长,依赖关系复杂的时候。一般来说,编译器会通过各种方式理清代码的逻辑,比如不...

  • Mantle 源代码阅读笔记 一

    Mantle 源代码阅读笔记 一 Mantle 源代码阅读笔记 一

  • 阅读散记(1)

    《代码阅读方法与实践》(中文版)——第一章 导论 为什么要阅读代码? 将代码作为文献 了解代码的工作方式 维护代码...

  • Vue2源码阅读(一):响应式原理

    一、阅读准备 阅读Vue.js代码前,需要准备: 仓库代码,方便加注释和多段关键代码可以同时阅读 打包后未压缩的代...

  • flag 代码阅读

    读 mapillary 的 street viewer 代码。 读 sfm pipeline 的 viewer 代...

  • 阅读代码之我见

    阅读代码之我见 学习编程离不开读源码阶段,阅读源码,你会发现很多新的架构包括库,积累技术要点,优化自己的书写代码模...

  • SDWebImage代码阅读

    SDWebImageManager 负责管理图片的检查、下载,以及对这些操作进行管理。 SDImageCache ...

网友评论

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

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