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

相關文章
相關標籤/搜索