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, } }
- 读取
网友评论