亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

詳解golang中bufio包的實現原理

2020-04-01 18:59:48
字體:
來源:轉載
供稿:網友

最近用golang/260751.html">golang寫了一個處理文件的腳本,由于其中涉及到了文件讀寫,開始使用golang中的 io 包,后來發現golang 中提供了一個bufio的包,使用這個包可以大幅提高文件讀寫的效率,于是在網上搜索同樣的文件讀寫為什么bufio 要比io的讀寫更快速呢?根據網上的資料和閱讀源碼,以下來詳細解釋下bufio的高效如何實現的。

bufio 包介紹 

bufio包實現了有緩沖的I/O。它包裝一個io.Reader或io.Writer接口對象,創建另一個也實現了該接口,且同時還提供了緩沖和一些文本I/O的幫助函數的對象。

以上為官方包的介紹,在其中我們能了解到的信息如下:

bufio 是通過緩沖來提高效率

簡單的說就是,把文件讀取進緩沖(內存)之后再讀取的時候就可以避免文件系統的io 從而提高速度。同理,在進行寫操作時,先把文件寫入緩沖(內存),然后由緩沖寫入文件系統??赐暌陨辖忉層腥丝赡軙硎纠Щ罅?,直接把 內容->文件 和 內容->緩沖->文件相比, 緩沖區好像沒有起到作用嘛。其實緩沖區的設計是為了存儲多次的寫入,最后一口氣把緩沖區內容寫入文件。下面會詳細解釋

bufio 封裝了io.Reader或io.Writer接口對象,并創建另一個也實現了該接口的對象

io.Reader或io.Writer 接口實現read() 和 write() 方法,對于實現這個接口的對象都是可以使用這兩個方法的

bufio 包實現原理

golang,bufio包,bufio

bufio 源碼分析

Reader對象

bufio.Reader 是bufio中對io.Reader 的封裝

// Reader implements buffering for an io.Reader object.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  lastRuneSize int}

bufio.Read(p []byte) 相當于讀取大小len(p)的內容,思路如下:

  1. 當緩存區有內容的時,將緩存區內容全部填入p并清空緩存區
  2. 當緩存區沒有內容的時候且len(p)>len(buf),即要讀取的內容比緩存區還要大,直接去文件讀取即可
  3. 當緩存區沒有內容的時候且len(p)<len(buf),即要讀取的內容比緩存區小,緩存區從文件讀取內容充滿緩存區,并將p填滿(此時緩存區有剩余內容)
  4. 以后再次讀取時緩存區有內容,將緩存區內容全部填入p并清空緩存區(此時和情況1一樣)

以下是源碼

// Read reads data into p.// It returns the number of bytes read into p.// The bytes are taken from at most one Read on the underlying Reader,// hence n may be less than len(p).// At EOF, the count will be zero and err will be io.EOF.func (b *Reader) Read(p []byte) (n int, err error) {  n = len(p)  if n == 0 {    return 0, b.readErr()  }  if b.r == b.w {    if b.err != nil {      return 0, b.readErr()    }    if len(p) >= len(b.buf) {      // Large read, empty buffer.      // Read directly into p to avoid copy.      n, b.err = b.rd.Read(p)      if n < 0 {        panic(errNegativeRead)      }      if n > 0 {        b.lastByte = int(p[n-1])        b.lastRuneSize = -1      }      return n, b.readErr()    }    // One read.    // Do not use b.fill, which will loop.    b.r = 0    b.w = 0    n, b.err = b.rd.Read(b.buf)    if n < 0 {      panic(errNegativeRead)    }    if n == 0 {      return 0, b.readErr()    }    b.w += n  }  // copy as much as we can  n = copy(p, b.buf[b.r:b.w])  b.r += n  b.lastByte = int(b.buf[b.r-1])  b.lastRuneSize = -1  return n, nil}

說明:

reader內部通過維護一個r, w 即讀入和寫入的位置索引來判斷是否緩存區內容被全部讀出

Writer對象

bufio.Writer 是bufio中對io.Writer 的封裝

// Writer implements buffering for an io.Writer object.type Writer struct {  err error  buf []byte  n  int  wr io.Writer}

bufio.Write(p []byte) 的思路如下

  1. 判斷buf中可用容量是否可以放下 p
  2. 如果能放下,直接把p拼接到buf后面,即把內容放到緩沖區
  3. 如果緩沖區的可用容量不足以放下,且此時緩沖區是空的,直接把p寫入文件即可
  4. 如果緩沖區的可用容量不足以放下,且此時緩沖區有內容,則用p把緩沖區填滿,把緩沖區所有內容寫入文件,并清空緩沖區
  5. 判斷p的剩余內容大小能否放到緩沖區,如果能放下(此時和步驟1情況一樣)則把內容放到緩沖區
  6. 如果p的剩余內容依舊大于緩沖區,(注意此時緩沖區是空的,情況和步驟2一樣)則把p的剩余內容直接寫入文件

以下是源碼

// Write writes the contents of p into the buffer.// It returns the number of bytes written.// If nn < len(p), it also returns an error explaining// why the write is short.func (b *Writer) Write(p []byte) (nn int, err error) {  for len(p) > b.Available() && b.err == nil {    var n int    if b.Buffered() == 0 {      // Large write, empty buffer.      // Write directly from p to avoid copy.      n, b.err = b.wr.Write(p)    } else {      n = copy(b.buf[b.n:], p)      b.n += n      b.flush()    }    nn += n    p = p[n:]  }  if b.err != nil {    return nn, b.err  }  n := copy(b.buf[b.n:], p)  b.n += n  nn += n  return nn, nil}

說明:

b.wr 存儲的是一個io.writer對象,實現了Write()的接口,所以可以使用b.wr.Write(p) 將p的內容寫入文件

b.flush() 會將緩存區內容寫入文件,當所有寫入完成后,因為緩存區會存儲內容,所以需要手動flush()到文件

b.Available() 為buf可用容量,等于len(buf) - n

下圖解釋的是其中一種情況,即緩存區有內容,剩余p大于緩存區

golang,bufio包,bufio

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产色婷婷国产综合在线理论片a| 久久99热精品| 欧美日韩美女视频| 曰本色欧美视频在线| 亚洲精品视频中文字幕| 国产精品免费看久久久香蕉| 日韩av在线电影网| 日本中文字幕不卡免费| 欧美日韩国产va另类| 亚洲剧情一区二区| 高清在线视频日韩欧美| 亚洲桃花岛网站| 色吧影院999| 国产成人av网址| 欧美一级电影在线| 高清视频欧美一级| 国产福利精品在线| 97在线观看免费高清| www.色综合| 日韩高清电影免费观看完整版| 成人欧美一区二区三区在线湿哒哒| 亚洲精品日韩欧美| 日本精品免费观看| 北条麻妃一区二区在线观看| 国内伊人久久久久久网站视频| 日韩av大片在线| 国产精品久久在线观看| 久久久久久久久久久国产| 欧美国产日韩一区| 久久久999国产| 亲爱的老师9免费观看全集电视剧| 正在播放欧美一区| 日韩中文字幕在线| 欧美黑人巨大精品一区二区| 成人免费视频xnxx.com| 亚洲一区二区中文| 51视频国产精品一区二区| 668精品在线视频| 日韩一区在线视频| 日韩精品在线观看一区二区| 91久久久久久久一区二区| 欧美日韩在线视频一区| 亚洲午夜激情免费视频| 波霸ol色综合久久| 国产精品男人爽免费视频1| 亚洲欧美日韩综合| 日本成人免费在线| 亚洲精品资源美女情侣酒店| 久久久久成人精品| 91香蕉电影院| 亚洲自拍另类欧美丝袜| 88xx成人精品| 国产欧亚日韩视频| 国产精品久久久久久久7电影| 国产精品www网站| 国产91免费看片| 福利一区视频在线观看| 国产噜噜噜噜噜久久久久久久久| 在线观看亚洲区| 亚洲欧美国产另类| 久久精品视频播放| 国产精品成人久久久久| 日韩av日韩在线观看| 亚洲国产精品高清久久久| 成人xxxx视频| 久久久久久久久久久久av| 国产一区二区丝袜高跟鞋图片| 欧美日韩在线观看视频| 国产亚洲精品久久久久久牛牛| 成人精品一区二区三区电影免费| 久久中文字幕视频| 精品日韩美女的视频高清| 欧美日韩激情小视频| 成人福利网站在线观看11| 国产ts人妖一区二区三区| 亚洲欧美中文在线视频| 欧美最猛性xxxxx免费| 久久精品色欧美aⅴ一区二区| 欧美精品九九久久| 国产精品亚洲欧美导航| 欧美日韩美女视频| 狠狠爱在线视频一区| 亚洲毛片在线观看| 亚洲视频欧美视频| 国产精品成人免费视频| 97欧美精品一区二区三区| 日韩中文在线中文网三级| 国产日韩中文字幕| 成人中文字幕在线观看| 91精品国产自产在线观看永久| 日韩视频在线免费| 成人免费网站在线看| 久久免费高清视频| 91亚洲精品在线观看| 日本高清+成人网在线观看| 在线日韩精品视频| 欧美日韩成人精品| 国产精品精品久久久久久| 亚洲第一av网站| 九九热最新视频//这里只有精品| 日韩在线观看电影| 精品中文字幕乱| 亚洲电影在线观看| 国产成人精品久久二区二区| 欧美激情日韩图片| 色播久久人人爽人人爽人人片视av| 久久精品国产v日韩v亚洲| 久久久亚洲精品视频| 亚洲第一网站男人都懂| 亚洲一区二区在线| 精品成人久久av| 中文字幕亚洲激情| 精品久久久久久久久久ntr影视| 亚洲国产精品女人久久久| 久久国产加勒比精品无码| 91精品国产高清自在线看超| 亚洲乱码国产乱码精品精天堂| 国产经典一区二区| 国产精品久久一区| 麻豆国产va免费精品高清在线| 国外成人免费在线播放| 全球成人中文在线| 日韩欧美成人免费视频| 欧美日韩精品在线视频| 欧美丝袜第一区| 欧美黄色片免费观看| 91精品国产高清久久久久久久久| 亚洲精品wwwww| 日韩精品中文字| 国产成+人+综合+亚洲欧洲| 一区二区成人av| 日韩av网址在线观看| 97视频在线免费观看| 国产成人精品久久二区二区91| 欧美成人全部免费| 亚洲性日韩精品一区二区| 欧美超级乱淫片喷水| 成人免费观看网址| 国产成人亚洲精品| 日韩中文在线不卡| 538国产精品视频一区二区| 精品视频中文字幕| 国产成人精品综合| 精品一区二区亚洲| 伊人久久大香线蕉av一区二区| 国产情人节一区| 91tv亚洲精品香蕉国产一区7ujn| 国产一区二区三区四区福利| 日韩麻豆第一页| 亚洲石原莉奈一区二区在线观看| 久久久精品一区二区| www高清在线视频日韩欧美| 欧美性猛交xxxx乱大交蜜桃| 日本不卡高字幕在线2019| 国产精品电影网| 国产精品久久久久久久久久久久| 欧美成在线视频| 中文字幕在线精品| 国产精品色视频| 亚洲乱码国产乱码精品精天堂| 色诱女教师一区二区三区| 久久久久久中文| 色一区av在线| 成人精品福利视频|