自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇文章帶你搞定Go語言基礎(chǔ)之文件操作

開發(fā) 前端
本次章節(jié)我們主要學習文件操作的相關(guān)知識,主要分為讀取文件和寫入文件

[[375517]]

前言

Hey,大家好呀,我是碼農(nóng),星期八,這次咱們來說一下文件操作。

文件操作就簡單了,像打開word了,excel了,都是文件操作,當然,我們肯定是不能直接操作word的

我們就從最簡單的普通文件開始叭!

打開和關(guān)閉文件

  1. package main 
  2.  
  3. import "os" 
  4.  
  5. func main() { 
  6.     //os.Open是只讀模式 
  7.     fileObj, err := os.Open("永不退縮.txt"
  8.     if err != nil { 
  9.         panic(err) 
  10.     //關(guān)閉文件 
  11.     fileObj.Close() 
  12.     //一般情況下使用這種方式關(guān)閉文件 
  13.     defer fileObj.Close() 

:如果你使用的是Goland,在學習文件操作這一塊時,盡量不要右擊運行,因為查找文件路徑不一樣

盡可能的編譯成.exe文件,這樣找的就是當前目錄


讀取文件

讀取指定大小

代碼

  1. func main() { 
  2.     //os.Open是只讀模式 
  3.     fileObj, err := os.Open("永不退縮.txt"
  4.     if err != nil { 
  5.         panic(err) 
  6.     var fileBytes = make([]byte,128) 
  7.     n, err := fileObj.Read(fileBytes) 
  8.     if err != nil { 
  9.         panic(err) 
  10.     fmt.Println(string(fileBytes[:n])) 
  11.     //一般情況下使用這種方式關(guān)閉文件 
  12.     defer fileObj.Close() 

執(zhí)行結(jié)果


可以發(fā)現(xiàn),根本就沒有讀取完,并且還亂碼了。

讀取整個文件

上述我們只讀取了128個字節(jié),一個中文3個字節(jié),128/3,除下標點符號,應該是40個左右,明顯不夠

那該怎么辦才能讀取所有呢???

上述我們只讀取了128個字節(jié),我們可以在讀取128個字節(jié)啊

然后找個罐子將每次讀取的都裝進去,讀取完,裝完,完美

代碼

  1. func main() { 
  2.     //os.Open是只讀模式 
  3.     fileObj, err := os.Open("永不退縮.txt"
  4.     if err != nil { 
  5.         panic(err) 
  6.     //一般情況下使用這種方式關(guān)閉文件 
  7.     defer fileObj.Close() 
  8.  
  9.     var 罐子 []string 
  10.     var 每次讀取字節(jié) = make([]byte,128) 
  11.     for
  12.         n, err := fileObj.Read(每次讀取字節(jié)) 
  13.         //err == io.EOF表示讀完了,一定要放在err != nil前面 
  14.         if err == io.EOF { 
  15.             break 
  16.         } 
  17.         if err != nil { 
  18.             panic(err) 
  19.         } 
  20.         var 每次讀取字符串 = string(每次讀取字節(jié)[:n]) 
  21.         罐子 = append(罐子,每次讀取字符串) 
  22.     fmt.Println(罐子) 

執(zhí)行結(jié)果


會發(fā)現(xiàn)還是有亂碼,這是為啥???

這是因為我們每次都是按照字節(jié)來讀取一部分,一部分的,但是中文是3個字節(jié),所有有時候可能切錯了,就出現(xiàn)了亂碼

那咋辦呢?沒辦法,默認的讀取文件就這么點功能,更多功能,盡在bufio

bufio

bufio可以理解為原生file操作的一個加強版,更牛叉,功能更多

還是上述這個文件,看看如何完美讀取

代碼

  1. func main() { 
  2.     //os.Open是只讀模式 
  3.     fileObj, err := os.Open("永不退縮.txt"
  4.     if err != nil { 
  5.         panic(err) 
  6.     //一般情況下使用這種方式關(guān)閉文件 
  7.     defer fileObj.Close() 
  8.  
  9.     //需要將文件對象傳進去 
  10.     reader := bufio.NewReader(fileObj) 
  11.     for
  12.         //按行讀取 
  13.         row, err := reader.ReadString('\n')//參數(shù)是字符,不是字符串 
  14.         if err == io.EOF { 
  15.             break 
  16.         } 
  17.         if err != nil { 
  18.             panic(err) 
  19.         } 
  20.         fmt.Printf("%v",row) 

執(zhí)行結(jié)果


讀取整個文件

可能又有人說了,啊,星期八,我感覺還是麻煩,有沒有更簡單的辦法讀取文件,肯定有呀,一次性讀取所有呢?答案是肯定的,此時需要用到ioutil包。

代碼

  1. func main() { 
  2.     //os.Open是只讀模式 
  3.     bytes, err := ioutil.ReadFile("永不退縮.txt"
  4.     if err != nil { 
  5.         panic(err) 
  6.     fmt.Println(string(bytes)) 

執(zhí)行結(jié)果


但是這種有個缺點,只能讀取小文件,要是來個10G文件也這樣玩,保證電腦死翹翹!!!

寫入文件

寫入文件的話,我們就需要使用openFile這個方法打開文件

在開始之前呢,先記一下下面幾種模式

  • os.O_WRONLY 只寫
  • os.O_RDONLY 只讀
  • os.O_CREATE 如果文件不存在,則創(chuàng)建文件
  • os.O_RDWR 可讀可寫
  • os.O_TRUNC 清空
  • os.O_APPEND 追加文件

寫入字節(jié)和寫入行

代碼

  1. func main() { 
  2.     fileObj, err := os.OpenFile("臨時.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 
  3.     if err != nil { 
  4.         panic(err) 
  5.     defer fileObj.Close() 
  6.     w_content := "我是臨時表內(nèi)容\n" 
  7.     //Write方法需要將字符串轉(zhuǎn)成字節(jié) 
  8.     fileObj.Write([]byte(w_content)) 
  9.     //WriteString直接寫入字符串 
  10.     fileObj.WriteString(w_content) 

執(zhí)行結(jié)果


bufio寫文件

代碼

  1. func main() { 
  2.     fileObj, err := os.OpenFile("臨時.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 
  3.     if err != nil { 
  4.         panic(err) 
  5.     defer fileObj.Close() 
  6.     w_content := "我是臨時表內(nèi)容\n" 
  7.     writer := bufio.NewWriter(fileObj) 
  8.     writer.Write([]byte(w_content)) 
  9.     writer.WriteString(w_content) 
  10.     //寫完必須刷入 
  11.     writer.Flush() 

執(zhí)行結(jié)果


ioutil寫文件

代碼

  1. func main() { 
  2.     w_content := "我是臨時表內(nèi)容\n" 
  3.     err := ioutil.WriteFile("臨時.txt", []byte(w_content), 0666) 
  4.     if err != nil { 
  5.         panic(err) 

執(zhí)行結(jié)果


拷貝文件

拷貝文件,就是拷貝文件唄,A文件拷貝到B文件中

其實他的底層還是打開倆文件,把A文件內(nèi)容寫入到B文件中

代碼

  1. func main() { 
  2.     原文件, err := os.Open("永不退縮.txt"
  3.     if err != nil { 
  4.         panic(err) 
  5.     defer 原文件.Close() 
  6.     目標文件, err := os.OpenFile("臨時.txt", os.O_WRONLY|os.O_CREATE, 0666) 
  7.     if err != nil { 
  8.         panic(err) 
  9.     defer 目標文件.Close() 
  10.     //拷貝文件 
  11.     io.Copy(目標文件,原文件) 

執(zhí)行結(jié)果


總結(jié)

本次章節(jié)我們主要學習文件操作的相關(guān)知識,主要分為讀取文件和寫入文件

讀取文件都有原生方法讀寫和bufio加強讀寫和ioutil一次性讀寫

推薦大家使用bufio這個包操作文件,帶有緩沖功能,性能更好!!

能堅持別人不能堅持的,才能擁有別人不能擁有的。加油

 

責任編輯:姜華 來源: Go語言進階學習
相關(guān)推薦

2021-02-20 10:06:14

語言文件操作

2020-12-23 08:39:11

Go語言基礎(chǔ)技術(shù)

2020-11-05 09:58:16

Go語言Map

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2022-04-27 10:01:43

切片Go封裝

2020-12-30 09:04:32

Go語言TCPUDP

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術(shù)

2020-10-23 08:38:19

Go語言

2021-10-09 07:10:31

Go語言基礎(chǔ)

2020-12-27 10:15:44

Go語言channel管道

2020-12-07 05:59:02

語言Go接口

2021-10-30 10:43:04

語言Go函數(shù)

2021-11-03 10:02:07

Go基礎(chǔ)函數(shù)

2021-02-27 10:20:18

Go語言flag包開發(fā)技術(shù)

2021-10-16 10:17:51

Go語言數(shù)據(jù)類型

2021-09-29 10:00:07

Go語言基礎(chǔ)

2021-10-13 10:00:52

Go語言基礎(chǔ)
點贊
收藏

51CTO技術(shù)棧公眾號