golang中bufio包

一苟鸯、介紹go標(biāo)準(zhǔn)庫中的bufio
最近用golang寫了一個處理文件的腳本,由于其中涉及到了文件讀寫抡柿,開始使用golang中的 io 包,后來發(fā)現(xiàn)golang 中提供了一個bufio的包爵赵,使用這個包可以大幅提高文件讀寫的效率吝秕,于是在網(wǎng)上搜索同樣的文件讀寫為什么bufio 要比io 的讀寫更快速呢?根據(jù)網(wǎng)上的資料和閱讀源碼空幻,以下來詳細(xì)解釋下bufio的高效如何實現(xiàn)的烁峭。

bufio 包介紹
bufio包實現(xiàn)了有緩沖的I/O。它包裝一個io.Reader或io.Writer接口對象秕铛,創(chuàng)建另一個也實現(xiàn)了該接口约郁,且同時還提供了緩沖和一些文本I/O的幫助函數(shù)的對象。

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

bufio 是通過緩沖來提高效率

簡單的說就是鬓梅,把文件讀取進(jìn)緩沖(內(nèi)存)之后再讀取的時候就可以避免文件系統(tǒng)的io 從而提高速度。同理谨湘,在進(jìn)行寫操作時己肮,先把文件寫入緩沖(內(nèi)存),然后由緩沖寫入文件系統(tǒng)悲关。看完以上解釋有人可能會表示困惑了娄柳,直接把 內(nèi)容->文件 和 內(nèi)容->緩沖->文件相比寓辱, 緩沖區(qū)好像沒有起到作用嘛。其實緩沖區(qū)的設(shè)計是為了存儲多次的寫入赤拒,最后一口氣把緩沖區(qū)內(nèi)容寫入文件秫筏。下面會詳細(xì)解釋

bufio 封裝了io.Reader或io.Writer接口對象,并創(chuàng)建另一個也實現(xiàn)了該接口的對象

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


image.png

注明:介紹內(nèi)容來自博主LiangWenT
这敬,原文鏈接:https://blog.csdn.net/LiangWenT/article/details/78995468,在查找資料時蕉朵,發(fā)現(xiàn)這篇博客的內(nèi)容很好理解

bufio包實現(xiàn)了緩存IO崔涂。它包裝了io.Reader和io.Write對象,創(chuàng)建了另外的Reader和Writer對象始衅,它們也實現(xiàn)了io.Reader和io.Write接口冷蚂,具有緩存。注意:緩存是放在主存中汛闸,既然是保存在主存里蝙茶,斷電會丟失數(shù)據(jù),那么要及時保存數(shù)據(jù)诸老。

二隆夯、常用內(nèi)容
1、Reader類型

type Reader struct {
    buf             []byte      // 緩存
    rd              io.Reader   // 底層的io.Reader 
    r, w            int
    err             error       // 讀過程中遇到的錯誤
    lastByte        int         // 最后一次讀到的字節(jié)      
    lastRuneSize    int         // 最后一次讀到的Rune的大小  
}

NewReaderSize

func NewReaderSize(rd io.Reader, size int) *Reader

作用:NewReaderSize將rd封裝成一個帶緩存的bufio.Reader對象。緩存大小由size指定(如果小于16則會被設(shè)為16)蹄衷。如果rd的基類型就是有足夠緩存的bufio.Reader類型忧额,則直接將rd轉(zhuǎn)換為基類型返回。
NewReader

func NewReader(rd io.Reader) *Reader

funcReader相當(dāng)于NewReaderSize(rd, 4096)
Peek

func (b *Reader) Peek(n int) ([]byte, error)

Peek返回緩存的一個切片宦芦,該切片引用緩存中前n個字節(jié)的數(shù)據(jù)宙址,該操作不會將數(shù)據(jù)讀出,只是引用调卑,引用的數(shù)據(jù)在下一次讀取操作之前有效的抡砂。如果切片長度小于n,則返回一個錯誤信息說明原因恬涧。如果n大于緩存的總大小注益,則返回ErrBufferFull。
Read

func (b *Reader) Read(p []byte) (n int, err error)

Read從b中數(shù)據(jù)到p中溯捆,返回讀出的字節(jié)數(shù)和遇到的錯誤丑搔。如果緩存不為空,則只能讀出緩沖中的數(shù)據(jù)提揍,不會從底層io.Reader中提取數(shù)據(jù)啤月,如果緩存為空,則:
1劳跃、len(p) >= 緩存大小谎仲,則跳過緩存,直接從底層io.Reader中讀出到p中
2刨仑、len(p)< 緩存大小郑诺,則先將數(shù)據(jù)從底層io.Reader中讀取到緩存中竖共,再從緩存讀取到p中曾沈。
Buffered

func (b *Reader) Buffered() int

Buffered返回緩存中未讀取的數(shù)據(jù)的長度。
Discard

func (b *Reader) Discard(n int) (discarded int, err error)

Discard跳過后續(xù)的n個字節(jié)的數(shù)據(jù)量淌,返回跳過的字節(jié)數(shù)轻抱。

Writer類型和方法
write結(jié)構(gòu)

type Write struct {
    err error       // 寫過程中遇到的錯誤
    buf []byte      // 緩存
    n   int         // 當(dāng)前緩存中的字節(jié)數(shù)
    wr  io.Writer   // 底層的io.Writer對象
}

NewWriteSize

func NewWriteSize(wr io.Write, size int) *Write

NewWriterSize將wr封裝成一個帶緩存的bufio.Writer對象飞涂,緩存大小由size指定(如果小于4096則會被設(shè)置未4096)。
NewWrite

func NewWriter(wr io.Writer) *Writer

NewWriter相等于NewWriterSize(wr, 4096)

WriteString

func (b *Write) WriteString(s string) (int, error)

WriteString功能同Write祈搜,只不過寫入的是字符串
WriteRune

func (b *Writer) WriteRune(r rune) (size int, err error)

WriteRune向b寫入r的UTF-8編碼封拧,返回r的編碼長度。
Flush

func (b *Writer) Flush() error

Available

func (b *Writer) Available() int

Available 返回緩存中未使用的空間的長度
Buffered

func (b *Writer) Buffered() int

Buffered返回緩存中未提交的數(shù)據(jù)長度
Reset

func (b *Write) Reset(w io.Writer)

Reset將b的底層Write重新指定為w夭问,同時丟棄緩存中的所有數(shù)據(jù)泽西,復(fù)位所有標(biāo)記和錯誤信息。相當(dāng)于創(chuàng)建了一個新的bufio.Writer缰趋。

GO中還提供了Scanner類型捧杉,處理一些比較簡單的場景陕见。如處理按行讀取輸入序列或空格分隔的詞等。
內(nèi)容來自:https://blog.csdn.net/wangshubo1989/article/details/70177928

參考鏈接:
1)https://blog.csdn.net/LiangWenT/article/details/78995468
2)https://blog.csdn.net/wangshubo1989/article/details/70177928

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末味抖,一起剝皮案震驚了整個濱河市评甜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仔涩,老刑警劉巖忍坷,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熔脂,居然都是意外死亡佩研,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門霞揉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旬薯,“玉大人,你說我怎么就攤上這事适秩“硇颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵秽荞,是天一觀的道長骤公。 經(jīng)常有香客問我,道長扬跋,這世上最難降的妖魔是什么淋样? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮胁住,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刊咳。我一直安慰自己彪见,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布娱挨。 她就那樣靜靜地躺著余指,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跷坝。 梳的紋絲不亂的頭發(fā)上酵镜,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音淮韭,去河邊找鬼靠粪。 笑死占键,一個胖子當(dāng)著我的面吹牛畔乙,可吹牛的內(nèi)容都是我干的牲距。 我是一名探鬼主播洛姑,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼龄广!你這毒婦竟也來了两入?” 一聲冷哼從身側(cè)響起裹纳,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤阻星,失蹤者是張志新(化名)和其女友劉穎妥箕,沒想到半個月后畦幢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾怠,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年往产,在試婚紗的時候發(fā)現(xiàn)自己被綠了仿村。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔼囊。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膳沽,靈堂內(nèi)的尸體忽然破棺而出挑社,到底是詐尸還是另有隱情痛阻,我是刑警寧澤麻车,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布啤斗,位于F島的核電站,受9級特大地震影響赁咙,放射性物質(zhì)發(fā)生泄漏钮莲。R本人自食惡果不足惜免钻,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崔拥。 院中可真熱鬧极舔,春花似錦、人聲如沸链瓦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慈俯。三九已至渤刃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贴膘,已是汗流浹背卖子。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刑峡,地道東北人洋闽。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像氛琢,于是被迫代替她去往敵國和親喊递。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353