本文主要介紹了Go語言中文件讀寫的相關(guān)操作。
目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、紅塔網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
文件是什么?
計(jì)算機(jī)中的文件是存儲(chǔ)在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。
os.Open() 函數(shù)能夠打開一個(gè)文件,返回一個(gè) *File 和一個(gè) err 。對(duì)得到的文件實(shí)例調(diào)用 close() 方法能夠關(guān)閉文件。
為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。
Read方法定義如下:
它接收一個(gè)字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯(cuò)誤,讀到文件末尾時(shí)會(huì)返回 0 和 io.EOF 。 舉個(gè)例子:
使用for循環(huán)讀取文件中的所有數(shù)據(jù)。
bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。
os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
其中:
name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:
perm :文件權(quán)限,一個(gè)八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。
一、介紹go標(biāo)準(zhǔn)庫中的bufio
最近用golang寫了一個(gè)處理文件的腳本,由于其中涉及到了文件讀寫,開始使用golang中的 io 包,后來發(fā)現(xiàn)golang 中提供了一個(gè)bufio的包,使用這個(gè)包可以大幅提高文件讀寫的效率,于是在網(wǎng)上搜索同樣的文件讀寫為什么bufio 要比io 的讀寫更快速呢?根據(jù)網(wǎng)上的資料和閱讀源碼,以下來詳細(xì)解釋下bufio的高效如何實(shí)現(xiàn)的。
bufio 包介紹
bufio包實(shí)現(xiàn)了有緩沖的I/O。它包裝一個(gè)io.Reader或io.Writer接口對(duì)象,創(chuàng)建另一個(gè)也實(shí)現(xiàn)了該接口,且同時(shí)還提供了緩沖和一些文本I/O的幫助函數(shù)的對(duì)象。
以上為官方包的介紹,在其中我們能了解到的信息如下:
bufio 是通過緩沖來提高效率
簡單的說就是,把文件讀取進(jìn)緩沖(內(nèi)存)之后再讀取的時(shí)候就可以避免文件系統(tǒng)的io 從而提高速度。同理,在進(jìn)行寫操作時(shí),先把文件寫入緩沖(內(nèi)存),然后由緩沖寫入文件系統(tǒng)??赐暌陨辖忉層腥丝赡軙?huì)表示困惑了,直接把 內(nèi)容-文件 和 內(nèi)容-緩沖-文件相比, 緩沖區(qū)好像沒有起到作用嘛。其實(shí)緩沖區(qū)的設(shè)計(jì)是為了存儲(chǔ)多次的寫入,最后一口氣把緩沖區(qū)內(nèi)容寫入文件。下面會(huì)詳細(xì)解釋
bufio 封裝了io.Reader或io.Writer接口對(duì)象,并創(chuàng)建另一個(gè)也實(shí)現(xiàn)了該接口的對(duì)象
io.Reader或io.Writer 接口實(shí)現(xiàn)read() 和 write() 方法,對(duì)于實(shí)現(xiàn)這個(gè)接口的對(duì)象都是可以使用這兩個(gè)方法的
注明:介紹內(nèi)容來自博主 LiangWenT
,原文鏈接: ,在查找資料時(shí),發(fā)現(xiàn)這篇博客的內(nèi)容很好理解
bufio包實(shí)現(xiàn)了緩存IO。它包裝了io.Reader和io.Write對(duì)象,創(chuàng)建了另外的Reader和Writer對(duì)象,它們也實(shí)現(xiàn)了io.Reader和io.Write接口,具有緩存。注意:緩存是放在主存中,既然是保存在主存里,斷電會(huì)丟失數(shù)據(jù),那么要及時(shí)保存數(shù)據(jù)。
二、常用內(nèi)容
1、Reader類型
NewReaderSize
作用:NewReaderSize將rd封裝成一個(gè)帶緩存的bufio.Reader對(duì)象。緩存大小由size指定(如果小于16則會(huì)被設(shè)為16)。如果rd的基類型就是有足夠緩存的bufio.Reader類型,則直接將rd轉(zhuǎn)換為基類型返回。
NewReader
funcReader相當(dāng)于NewReaderSize(rd, 4096)
Peek
Peek返回緩存的一個(gè)切片,該切片引用緩存中前n個(gè)字節(jié)的數(shù)據(jù),該操作不會(huì)將數(shù)據(jù)讀出,只是引用,引用的數(shù)據(jù)在下一次讀取操作之前有效的。如果切片長度小于n,則返回一個(gè)錯(cuò)誤信息說明原因。如果n大于緩存的總大小,則返回ErrBufferFull。
Read
Read從b中數(shù)據(jù)到p中,返回讀出的字節(jié)數(shù)和遇到的錯(cuò)誤。如果緩存不為空,則只能讀出緩沖中的數(shù)據(jù),不會(huì)從底層io.Reader中提取數(shù)據(jù),如果緩存為空,則:
1、len(p) = 緩存大小,則跳過緩存,直接從底層io.Reader中讀出到p中
2、len(p) 緩存大小,則先將數(shù)據(jù)從底層io.Reader中讀取到緩存中,再從緩存讀取到p中。
Buffered
Buffered返回緩存中未讀取的數(shù)據(jù)的長度。
Discard
Discard跳過后續(xù)的n個(gè)字節(jié)的數(shù)據(jù),返回跳過的字節(jié)數(shù)。
Writer類型和方法
write結(jié)構(gòu)
NewWriteSize
NewWriterSize將wr封裝成一個(gè)帶緩存的bufio.Writer對(duì)象,緩存大小由size指定(如果小于4096則會(huì)被設(shè)置未4096)。
NewWrite
NewWriter相等于NewWriterSize(wr, 4096)
WriteString
WriteString功能同Write,只不過寫入的是字符串
WriteRune
WriteRune向b寫入r的UTF-8編碼,返回r的編碼長度。
Flush
Available
Available 返回緩存中未使用的空間的長度
Buffered
Buffered返回緩存中未提交的數(shù)據(jù)長度
Reset
Reset將b的底層Write重新指定為w,同時(shí)丟棄緩存中的所有數(shù)據(jù),復(fù)位所有標(biāo)記和錯(cuò)誤信息。相當(dāng)于創(chuàng)建了一個(gè)新的bufio.Writer。
GO中還提供了Scanner類型,處理一些比較簡單的場景。如處理按行讀取輸入序列或空格分隔的詞等。
內(nèi)容來自:
參考鏈接:
1)
2)
bufReader.ReadBytes('\n')和 bufReader.ReadString('\n')在讀到文件最后一行時(shí),會(huì)同時(shí)返回內(nèi)容line和io.EOF。而bufReader.Read()讀取到末尾時(shí),會(huì)先返回內(nèi)容,然后再下一次迭代時(shí)才返回io.EOF
網(wǎng)站欄目:go語言bufio Go語言圣經(jīng)
文章網(wǎng)址:http://www.rwnh.cn/article20/dosheco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、、域名注冊、做網(wǎng)站、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)