您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Go語(yǔ)言中怎么實(shí)現(xiàn)文件操作,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
打開(kāi)和關(guān)閉文件
package main import "os" func main() { //os.Open是只讀模式 fileObj, err := os.Open("永不退縮.txt") if err != nil { panic(err) } //關(guān)閉文件 fileObj.Close() //一般情況下使用這種方式關(guān)閉文件 defer fileObj.Close() }
注:如果你使用的是Goland,在學(xué)習(xí)文件操作這一塊時(shí),盡量不要右擊運(yùn)行,因?yàn)椴檎椅募窂讲灰粯?/p>
盡可能的編譯成.exe文件,這樣找的就是當(dāng)前目錄
讀取文件
讀取指定大小
代碼
func main() { //os.Open是只讀模式 fileObj, err := os.Open("永不退縮.txt") if err != nil { panic(err) } var fileBytes = make([]byte,128) n, err := fileObj.Read(fileBytes) if err != nil { panic(err) } fmt.Println(string(fileBytes[:n])) //一般情況下使用這種方式關(guān)閉文件 defer fileObj.Close() }
執(zhí)行結(jié)果
可以發(fā)現(xiàn),根本就沒(méi)有讀取完,并且還亂碼了。
讀取整個(gè)文件
上述我們只讀取了128個(gè)字節(jié),一個(gè)中文3個(gè)字節(jié),128/3,除下標(biāo)點(diǎn)符號(hào),應(yīng)該是40個(gè)左右,明顯不夠
那該怎么辦才能讀取所有呢???
上述我們只讀取了128個(gè)字節(jié),我們可以在讀取128個(gè)字節(jié)啊
然后找個(gè)罐子將每次讀取的都裝進(jìn)去,讀取完,裝完,完美
代碼
func main() { //os.Open是只讀模式 fileObj, err := os.Open("永不退縮.txt") if err != nil { panic(err) } //一般情況下使用這種方式關(guān)閉文件 defer fileObj.Close() var 罐子 []string var 每次讀取字節(jié) = make([]byte,128) for{ n, err := fileObj.Read(每次讀取字節(jié)) //err == io.EOF表示讀完了,一定要放在err != nil前面 if err == io.EOF { break } if err != nil { panic(err) } var 每次讀取字符串 = string(每次讀取字節(jié)[:n]) 罐子 = append(罐子,每次讀取字符串) } fmt.Println(罐子) }
執(zhí)行結(jié)果
會(huì)發(fā)現(xiàn)還是有亂碼,這是為啥???
這是因?yàn)槲覀兠看味际前凑兆止?jié)來(lái)讀取一部分,一部分的,但是中文是3個(gè)字節(jié),所有有時(shí)候可能切錯(cuò)了,就出現(xiàn)了亂碼
那咋辦呢?沒(méi)辦法,默認(rèn)的讀取文件就這么點(diǎn)功能,更多功能,盡在bufio
bufio
bufio
可以理解為原生file操作的一個(gè)加強(qiáng)版,更牛叉,功能更多
還是上述這個(gè)文件,看看如何完美讀取
代碼
func main() { //os.Open是只讀模式 fileObj, err := os.Open("永不退縮.txt") if err != nil { panic(err) } //一般情況下使用這種方式關(guān)閉文件 defer fileObj.Close() //需要將文件對(duì)象傳進(jìn)去 reader := bufio.NewReader(fileObj) for{ //按行讀取 row, err := reader.ReadString('\n')//參數(shù)是字符,不是字符串 if err == io.EOF { break } if err != nil { panic(err) } fmt.Printf("%v",row) } }
執(zhí)行結(jié)果
讀取整個(gè)文件
可能又有人說(shuō)了,啊,星期八,我感覺(jué)還是麻煩,有沒(méi)有更簡(jiǎn)單的辦法讀取文件,肯定有呀,一次性讀取所有呢?答案是肯定的,此時(shí)需要用到ioutil包。
代碼
func main() { //os.Open是只讀模式 bytes, err := ioutil.ReadFile("永不退縮.txt") if err != nil { panic(err) } fmt.Println(string(bytes)) }
執(zhí)行結(jié)果
但是這種有個(gè)缺點(diǎn),只能讀取小文件,要是來(lái)個(gè)10G文件也這樣玩,保證電腦死翹翹!!!
寫(xiě)入文件
寫(xiě)入文件的話,我們就需要使用openFile這個(gè)方法打開(kāi)文件
在開(kāi)始之前呢,先記一下下面幾種模式
os.O_WRONLY 只寫(xiě)
os.O_RDONLY 只讀
os.O_CREATE 如果文件不存在,則創(chuàng)建文件
os.O_RDWR 可讀可寫(xiě)
os.O_TRUNC 清空
os.O_APPEND 追加文件
寫(xiě)入字節(jié)和寫(xiě)入行
代碼
func main() { fileObj, err := os.OpenFile("臨時(shí).txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { panic(err) } defer fileObj.Close() w_content := "我是臨時(shí)表內(nèi)容\n" //Write方法需要將字符串轉(zhuǎn)成字節(jié) fileObj.Write([]byte(w_content)) //WriteString直接寫(xiě)入字符串 fileObj.WriteString(w_content) }
執(zhí)行結(jié)果
bufio寫(xiě)文件
代碼
func main() { fileObj, err := os.OpenFile("臨時(shí).txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { panic(err) } defer fileObj.Close() w_content := "我是臨時(shí)表內(nèi)容\n" writer := bufio.NewWriter(fileObj) writer.Write([]byte(w_content)) writer.WriteString(w_content) //寫(xiě)完必須刷入 writer.Flush() }
執(zhí)行結(jié)果
ioutil寫(xiě)文件
代碼
func main() { w_content := "我是臨時(shí)表內(nèi)容\n" err := ioutil.WriteFile("臨時(shí).txt", []byte(w_content), 0666) if err != nil { panic(err) } }
執(zhí)行結(jié)果
拷貝文件
拷貝文件,就是拷貝文件唄,A文件拷貝到B文件中
其實(shí)他的底層還是打開(kāi)倆文件,把A文件內(nèi)容寫(xiě)入到B文件中
代碼
func main() { 原文件, err := os.Open("永不退縮.txt") if err != nil { panic(err) } defer 原文件.Close() 目標(biāo)文件, err := os.OpenFile("臨時(shí).txt", os.O_WRONLY|os.O_CREATE, 0666) if err != nil { panic(err) } defer 目標(biāo)文件.Close() //拷貝文件 io.Copy(目標(biāo)文件,原文件) }
執(zhí)行結(jié)果
看完上述內(nèi)容,你們對(duì)Go語(yǔ)言中怎么實(shí)現(xiàn)文件操作有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。