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

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

下一篇 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)方法的正确理解:.net

  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确实写得颇有意思。code

相关文章
相关标签/搜索