Go語(yǔ)言文件讀寫(xiě)操作案例詳解
基本介紹
文件,對(duì)我們并不陌生,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的 一種
輸入流和輸出流 文件在程序中是以流的形式來(lái)操作的
流:數(shù)據(jù)在數(shù)據(jù)源(文件)和程序(內(nèi)存)之間經(jīng)歷的路徑 輸入流:數(shù)據(jù)從文件到內(nèi)存的路徑 輸出流:數(shù)據(jù)從內(nèi)存到文件的路徑
- os.File封裝所有文件相關(guān)操作,File是一個(gè)結(jié)構(gòu)體
文件基本操作
讀操作
package main import ( "bufio" "fmt" "io" "io/ioutil" "mahonia" "os" ) func main() { //防止控制臺(tái)中文亂碼 如果是Golang編譯則需要安裝第三方轉(zhuǎn)碼包git clone https://github.com/axgle/mahonia.git var enc mahonia.Decoder enc = mahonia.NewDecoder("gbk") //讀取文件的內(nèi)容并顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString //打開(kāi)文件 file,err:=os.Open(文件的絕對(duì)路徑) file,err:=os.Open("F:/test.txt") if err !=nil{ fmt.Println("open file err=",err) } //關(guān)閉文件 defer file.Close() //要及時(shí)關(guān)閉文件,否則會(huì)有內(nèi)存泄露 //創(chuàng)建一個(gè)"Reader",帶緩存 默認(rèn)緩存大小為4096 reader:=bufio.NewReader(file) reader:=bufio.NewReader(file) //讀取文件的內(nèi)容 for{ str,err:=reader.ReadString('\n') fmt.Print(enc.ConvertString(str)) /* 你好啊 真的很好asdb 123 */ if err ==io.EOF{// 文件末尾 break } } //一次性讀取文件內(nèi)容,適用于文件較小的 無(wú)需開(kāi)啟和關(guān)閉文件 // 使用 ioutil.ReadFile content為byte[] content,err:=ioutil.ReadFile("f:/test.txt") if err!=nil{ fmt.Println("read file err=",err) } fmt.Print(enc.ConvertString(string(content))) /* 你好啊 真的很好asdb 123 */ }
寫(xiě)操作
文件打開(kāi)函數(shù) func OpenFile(name string,flag int,perm FileMode)(file *File,err error)
package main import ( "bufio" "fmt" "io" "io/ioutil" "mahonia" "os" ) func main() { //Read1() //Read2("f:/test.txt",'gbk') /* 你好啊 真的很好asdb 123 你好啊 真的很好asdb 123 */ //創(chuàng)建一個(gè)新文件,寫(xiě)入內(nèi)容 5句 "hello,Gardon" //Write() //打開(kāi)一個(gè)存在的文件中,將原來(lái)的內(nèi)容覆蓋成新的內(nèi)容10句,"你好,世界!!" //Write2() //打開(kāi)一個(gè)存在的 文件,將原來(lái)的內(nèi)容追加內(nèi)容"ABC! ENGLISH!" //Write3() //打開(kāi)一個(gè)存在的文件,將原來(lái)的內(nèi)容讀出顯示在終端,并追加5句"hello,北京" Write4() } func Read1(){ //防止控制臺(tái)中文亂碼 如果是Golang編譯則需要安裝第三方轉(zhuǎn)碼包git clone https://github.com/axgle/mahonia.git var enc mahonia.Decoder enc = mahonia.NewDecoder("gbk") //讀取文件的內(nèi)容并顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString //打開(kāi)文件 file,err:=os.Open(文件的絕對(duì)路徑) file,err:=os.Open("F:/test.txt") if err !=nil{ fmt.Println("open file err=",err) } //關(guān)閉文件 defer file.Close() //要及時(shí)關(guān)閉文件,否則會(huì)有內(nèi)存泄露 //創(chuàng)建一個(gè)"Reader",帶緩存 默認(rèn)緩存大小為4096 reader:=bufio.NewReader(file) reader:=bufio.NewReader(file) //讀取文件的內(nèi)容 for{ str,err:=reader.ReadString('\n') fmt.Print(enc.ConvertString(str)) /* 你好啊 真的很好asdb 123 */ if err ==io.EOF{// 文件末尾 break } } } func Read2(filename string,encode string){ var enc mahonia.Decoder enc = mahonia.NewDecoder(encode) //一次性讀取文件內(nèi)容,適用于文件較小的 無(wú)需開(kāi)啟和開(kāi)啟文件 // 使用 ioutil.ReadFile content為byte[] content,err:=ioutil.ReadFile(filename) if err!=nil{ fmt.Println("read file err=",err) } fmt.Print(enc.ConvertString(string(content))) } func Write(){ filename:="f:/test2.txt" //創(chuàng)建文件,并以只寫(xiě)形式打開(kāi) file,err:=os.OpenFile(filename,os.O_CREATE |os.O_WRONLY,0666) if err !=nil{ fmt.Println("open file err=",err) return } defer file.Close() //寫(xiě)入內(nèi)容 str:="hello,Gardon\r\n" //寫(xiě)入時(shí),帶有緩存的*Writer writer:=bufio.NewWriter(file) for i:=0;i<5 ;i++ { writer.WriteString(str) } //刷新緩存 writer.Flush() //讀取文件 Read2(filename,"gbk") /* hello,Gardon hello,Gardon hello,Gardon hello,Gardon hello,Gardon */ } func Write2(){ filename:="f:/test2.txt" //創(chuàng)建文件,并以只寫(xiě)形式打開(kāi) file,err:=os.OpenFile(filename,os.O_CREATE |os.O_TRUNC,0666) if err !=nil{ fmt.Println("open file err=",err) return } defer file.Close() //寫(xiě)入內(nèi)容 str:="你好,世界!!\r\n" //寫(xiě)入時(shí),帶有緩存的*Writer writer:=bufio.NewWriter(file) for i:=0;i<10 ;i++ { writer.WriteString(str) } //刷新緩存 writer.Flush() //讀取文件 Read2(filename,"utf-8") /* 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! */ } func Write3(){ filename:="f:/test2.txt" //創(chuàng)建文件,并以只寫(xiě)形式打開(kāi) file,err:=os.OpenFile(filename,os.O_CREATE |os.O_APPEND,0666) if err !=nil{ fmt.Println("open file err=",err) return } defer file.Close() //寫(xiě)入內(nèi)容 str:="ABC! ENGLISH!\r\n" //寫(xiě)入時(shí),帶有緩存的*Writer writer:=bufio.NewWriter(file) writer.WriteString(str) //刷新緩存 writer.Flush() //讀取文件 Read2(filename,"utf-8") /* 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! ABC! ENGLISH! */ } func Write4(){ filename:="f:/test2.txt" //創(chuàng)建文件,并以只寫(xiě)形式打開(kāi) file,err:=os.OpenFile(filename,os.O_RDWR |os.O_APPEND,0666) if err !=nil{ fmt.Println("open file err=",err) return } defer file.Close() //追加內(nèi)容 Read2(filename,"utf-8") /* 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! ABC! ENGLISH! */ str:="hello,北京\r\n" //寫(xiě)入時(shí),帶有緩存的*Writer writer:=bufio.NewWriter(file) writer.WriteString(str) //刷新緩存 writer.Flush() //讀取文件 Read2(filename,"utf-8") /* 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! 你好,世界!! ABC! ENGLISH! hello,北京 */ }
寫(xiě)操作案例
查看文件或目錄是否存在
package main import ( "fmt" "os" ) func main() { fmt.Println(PathExists("f:/test2.txt")) //true <nil> fmt.Println(PathExists("f:/test3.txt")) //false <nil> } func PathExists(path string) (bool, error) { _, err := os.Stat(path) //如果返回的錯(cuò)誤為nil,說(shuō)明文件或文件夾存在 if err == nil { return true, nil } //如果返回的錯(cuò)誤類(lèi)型使用os.IsNotExist()判斷為true,說(shuō)明文件或文件夾不存在 if os.IsNotExist(err){ return false, nil } //如果返回的 錯(cuò)誤為其他類(lèi)型,則不確定是否在存在 return false,err }
拷貝文件
package main import ( "bufio" "fmt" "io" "os" ) func main() { fmt.Println(PathExists("f:/test2.txt")) //true <nil> fmt.Println(PathExists("f:/test3.txt")) //false <nil> written,err:=CopyFile("f:/test3.txt","f:/test2.txt") if err!=nil{ fmt.Println("拷貝失敗!!") }else{ fmt.Println("拷貝成功!!") } fmt.Println(written) } func PathExists(path string) (bool, error) { _, err := os.Stat(path) //如果返回的錯(cuò)誤為nil,說(shuō)明文件或文件夾存在 if err == nil { return true, nil } //如果返回的錯(cuò)誤類(lèi)型使用os.IsNotExist()判斷為true,說(shuō)明文件或文件夾不存在 if os.IsNotExist(err){ return false, nil } //如果返回的 錯(cuò)誤為其他類(lèi)型,則不確定是否在存在 return false,err } func CopyFile(writerFileName string,readerFileName string) (written int64,err error){ ReaderFile,err2:=os.Open(readerFileName) WriterFlag,_:=PathExists(writerFileName) var WriterFile *os.File if WriterFlag{ WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_TRUNC,0666) }else{ WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_CREATE,0666) } if err !=nil{ fmt.Println("file open err=",err) return } writer:=bufio.NewWriter(WriterFile) defer WriterFile.Close() if err2 !=nil{ fmt.Println("file open err=",err2) return } defer ReaderFile.Close() reader:=bufio.NewReader(ReaderFile) return io.Copy(writer,reader) }
以上就是Go語(yǔ)言文件讀寫(xiě)操作案例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言文件讀寫(xiě)操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang 實(shí)現(xiàn)時(shí)間戳和時(shí)間的轉(zhuǎn)化
這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間戳和時(shí)間的轉(zhuǎn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理解析
這篇文章主要介紹了go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理,這里提供一個(gè)通過(guò)docker快速安裝Consul的方式,當(dāng)然前提是你得安裝了docker,需要的朋友可以參考下2022-04-04Go中g(shù)in框架的*gin.Context參數(shù)常見(jiàn)實(shí)用方法
*gin.Context是處理HTTP請(qǐng)求的核心,ctx代表"context"(上下文),它包含了處理請(qǐng)求所需的所有信息和方法,例如請(qǐng)求數(shù)據(jù)、響應(yīng)構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見(jiàn)實(shí)用方法,需要的朋友可以參考下2024-07-07Go 并發(fā)讀寫(xiě) sync.map 詳細(xì)
閱讀本文你將會(huì)明確 sync.Map 和原生 map +互斥鎖/讀寫(xiě)鎖之間的性能情況。標(biāo)準(zhǔn)庫(kù) sync.Map 雖說(shuō)支持并發(fā)讀寫(xiě) map,但更適用于讀多寫(xiě)少的場(chǎng)景,因?yàn)樗麑?xiě)入的性能比較差,使用時(shí)要考慮清楚這一點(diǎn)。2021-10-10簡(jiǎn)單聊聊Go語(yǔ)言中空結(jié)構(gòu)體和空字符串的特殊之處
在日常的編程過(guò)程中,大家應(yīng)該經(jīng)常能遇到各種”空“吧,比如空指針、空結(jié)構(gòu)體、空字符串等,本文就以?Go?語(yǔ)言為例,一起來(lái)看看空結(jié)構(gòu)體和空字符串在?Go?語(yǔ)言中的特殊之處吧2024-03-03深入解析Go語(yǔ)言中for循環(huán)的寫(xiě)法
這篇文章主要介紹了Go語(yǔ)言中for循環(huán)的寫(xiě)法,是Golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10Golang實(shí)踐之Error創(chuàng)建和處理詳解
在 C#、Java 等語(yǔ)言中常常使用 try...catch的方式來(lái)捕獲異常,但是在Golang 對(duì)于錯(cuò)誤處理有不同的方式,像網(wǎng)上也有很多對(duì) error 處理的最佳實(shí)踐的文章,其中很多其實(shí)就是對(duì) error 的統(tǒng)一封裝,使用規(guī)范進(jìn)行約束,本文主要是記錄自己對(duì)處理 Error 的一些認(rèn)識(shí)和學(xué)習(xí)2023-09-09