Go讀取文件與寫入文件的三種方法操作指南
打開和關(guān)閉文件操作:
os.Open()函數(shù)能夠打開一個(gè)文件,返回一個(gè)*File和一個(gè)err。對(duì)得到的文件實(shí)例調(diào)用close()方法能夠關(guān)閉文件。
package main import ( "fmt" "os" ) //文件操作 func main(){ //打開文件 file, err := os.Open("./test.txt") //只是用來讀的時(shí)候,用os.Open。相對(duì)路徑,針對(duì)于同目錄下。 if err != nil{ fmt.Printf("打開文件失敗,err:%v\n",err) return } defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件 }
打開文件讀取內(nèi)容并關(guān)閉文件:
package main import ( "fmt" "os" ) //文件操作 func main(){ //打開文件 file, err := os.Open("./test.txt") //只是用來讀的時(shí)候,用os.Open。相對(duì)路徑,針對(duì)于同目錄下。 if err != nil{ fmt.Printf("打開文件失敗,err:%v\n",err) return } defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件 //讀取文件內(nèi)容 var qiepian = make([]byte,128) //做一個(gè)大小為128字節(jié)的切片 n, err := file.Read(qiepian) //file.Read里面是一個(gè)切片.如果讀取成功,那么值聲明變量n并同時(shí)賦值給n。 //判斷 if err != nil{ //if err != nil 意思是如果err不為空,那么就說明err有錯(cuò)誤值,打印讀取錯(cuò)誤。如果為空,說明err沒有錯(cuò)誤值,打印讀取成功 fmt.Printf("讀取文件錯(cuò)誤,錯(cuò)誤值為:%v\n",err) return } fmt.Printf("讀取文件成功,文件字節(jié)大小為:%d\n",n) fmt.Println(string(qiepian)) }
但是如果文件的字節(jié)大小大于128呢?
如果文件有1W個(gè)字節(jié),但是我們?cè)O(shè)置的一次只能讀取128個(gè),怎么樣才能全部讀取文件內(nèi)容?
用循環(huán)讀取,一次讀128,直到讀完。
func readall(){ //打開文件 file, err := os.Open("./test.txt") //只是用來讀的時(shí)候,用os.Open。相對(duì)路徑,針對(duì)于同目錄下。 if err != nil{ fmt.Printf("打開文件失敗,err:%v\n",err) return } defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件 //讀取文件內(nèi)容 for { var qiepian = make([]byte,128) //做一個(gè)大小為128字節(jié)的切片 n, err := file.Read(qiepian) //file.Read里面是一個(gè)切片.如果讀取成功,那么值聲明變量n并同時(shí)賦值給n。 if err == io.EOF{ //EOF表示 end of file,就是文件的末尾,這個(gè)判斷意思就是,讀到文件末尾的時(shí)候,將當(dāng)前讀了多少字節(jié)打印出來并退出 //把當(dāng)前讀了多少字節(jié)的數(shù)據(jù)打印出來,然后退出 fmt.Println(string(qiepian)) return } //判斷 if err != nil{ //if err != nil 意思是如果err不為空,那么就說明err有錯(cuò)誤值,打印讀取錯(cuò)誤。如果為空,說明err沒有錯(cuò)誤值,打印讀取成功 fmt.Printf("讀取文件錯(cuò)誤,錯(cuò)誤值為:%v\n",err) return } fmt.Printf("讀取文件成功,文件字節(jié)大小為:%d\n",n) fmt.Println(string(qiepian[:n])) } } func main(){ readall() }
但是這樣寫,有點(diǎn)太麻煩。
基于此,使用go語言中的內(nèi)置包,buffio和ioutil來讀取
buffio操作:
是在file基礎(chǔ)上封裝了一層IP。
先把磁盤的內(nèi)容讀到緩沖區(qū),然后再讀到代碼中去。
寫入是先將寫入的內(nèi)容寫到緩沖區(qū),然后再寫到磁盤中去。
func readBybuffio(){ //打開文件 file, err := os.Open("./test.txt") //只是用來讀的時(shí)候,用os.Open。相對(duì)路徑,針對(duì)于同目錄下。 if err != nil{ fmt.Printf("打開文件失敗,err:%v\n",err) return } defer file.Close() //關(guān)閉文件,為了避免文件泄露和忘記寫關(guān)閉文件 //使用buffio讀取文件內(nèi)容 reader := bufio.NewReader(file) //創(chuàng)建新的讀的對(duì)象 for { line , err := reader.ReadString('\n') //注意是字符,換行符。 if err == io.EOF{ fmt.Println("文件讀完了") break } if err != nil{ //錯(cuò)誤處理 fmt.Printf("讀取文件失敗,錯(cuò)誤為:%v",err) return } fmt.Println(line) } } func main(){ readBybuffio() }
ioutil讀取整個(gè)文件:
//ioutuil func readByioutil(){ iot,err := ioutil.ReadFile("./test.txt") //讀取文件 if err != nil{ //做錯(cuò)誤判斷 fmt.Printf("讀取文件錯(cuò)誤,錯(cuò)誤為:%v\n",err) return } fmt.Println(string(iot)) //打印文件內(nèi)容 }
所以我們可以得知,go語言中讀取文件的三種方法。
第一種,我們可以使用切片的形式,定制一次讀取文件的多少字節(jié)并用for循環(huán)來讀取文件的內(nèi)容。
第二種,我們可以使用go語言內(nèi)置的buffio包來一行一行的讀取文件的內(nèi)容。
第三種,我們可以使用go語言內(nèi)置的ioutil包來讀取整個(gè)文件的所有內(nèi)容。
文件寫入操作
os.OpenFile()函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
Write和WriteString寫入操作
package main import ( "fmt" "os" ) //文件寫入 func write(){ //os.O_CREATE:創(chuàng)建 //os.O_WRONLY:只寫 //os.O_APPEND:追加 //os.O_RDONLY:只讀 //os.O_RDWR:讀寫 //os.O_TRUNC:清空 //0644:文件的權(quán)限 //如果沒有test.txt這個(gè)文件那么就創(chuàng)建,并且對(duì)這個(gè)文件只進(jìn)行寫和追加內(nèi)容。 file,err := os.OpenFile("./test.txt",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644) if err != nil{ fmt.Printf("文件錯(cuò)誤,錯(cuò)誤為:%v\n",err) return } defer file.Close() str := "你好啊\n" file.Write([]byte(str)) //將str字符串的內(nèi)容寫到文件中,強(qiáng)制轉(zhuǎn)換為byte,因?yàn)閃rite接收的是byte。 file.WriteString("Hello") //寫字符串 } func main(){ write() }
使用buffio內(nèi)置包來讀文件
bufio.NewWriter: 先往緩沖區(qū)寫,然后才寫到磁盤中去。
func buffiowrite(){ file,err := os.OpenFile("./gch.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644) if err != nil{ fmt.Printf("打開文件失敗,錯(cuò)誤為:%v\n",err) return } defer file.Close() //關(guān)閉文件 writer := bufio.NewWriter(file) //往文件里面寫入內(nèi)容,得到了一個(gè)writer對(duì)象 for i := 0; i <10; i++ { //循環(huán)寫入10行 writer.WriteString("test\n") //將數(shù)據(jù)寫入緩存 } writer.Flush() //將緩存中內(nèi)容的寫入文件 }
第三種寫入文件方法:ioutil.WriteFile
func ioutilWrite(){ str := "Hello Golang!" err := ioutil.WriteFile("./ioutil.txt",[]byte(str),0664)//接收文件名,字節(jié)類型的數(shù)據(jù),文件的權(quán)限 if err != nil{ fmt.Printf("打開文件失敗,錯(cuò)誤為:%v\n",err) return } }
總結(jié)
到此這篇關(guān)于Go讀取文件與寫入文件的三種方法操作的文章就介紹到這了,更多相關(guān)Go讀取文件與寫入文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 標(biāo)準(zhǔn)庫增加metrics指標(biāo)探討分析
go中有一個(gè)神奇的標(biāo)準(zhǔn)庫 runtime/metrics,提供了一系列預(yù)定義好的 Go 自身的相關(guān)指標(biāo),如果沒有編寫過基礎(chǔ)監(jiān)控庫或者關(guān)注的比較少的朋友可能會(huì)沒接觸到這類指標(biāo),本文展開現(xiàn)有metrics 指標(biāo),并結(jié)合現(xiàn)有的社區(qū)討論一起看看還有沒有必要增加更多的標(biāo)準(zhǔn)庫指標(biāo)2023-10-10Golang實(shí)現(xiàn)自己的orm框架實(shí)例探索
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的orm框架實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01go語言實(shí)現(xiàn)markdown解析庫的方法示例
這篇文章主要介紹了go語言實(shí)現(xiàn)markdown解析庫的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02golang中set數(shù)據(jù)結(jié)構(gòu)的使用示例
本文主要介紹了golang中set數(shù)據(jù)結(jié)構(gòu)的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Go語言kylin任務(wù)自動(dòng)化實(shí)例詳解
這篇文章主要為大家介紹了Go語言kylin任務(wù)自動(dòng)化實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06