首頁 > 軟體

Go讀取檔案與寫入檔案的三種方法操作指南

2022-09-16 22:03:28

開啟和關閉檔案操作:

os.Open()函數能夠開啟一個檔案,返回一個*File和一個err。對得到的檔案範例呼叫close()方法能夠關閉檔案。

package main
import (
    "fmt"
    "os"
)
//檔案操作
func main(){
    //開啟檔案
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對於同目錄下。
    if err != nil{
        fmt.Printf("開啟檔案失敗,err:%vn",err)
        return
    }
    defer file.Close() //關閉檔案,為了避免檔案洩露和忘記寫關閉檔案
}

開啟檔案讀取內容並關閉檔案:

package main

import (
    "fmt"
    "os"
)
//檔案操作
func main(){
    //開啟檔案
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對於同目錄下。
    if err != nil{
        fmt.Printf("開啟檔案失敗,err:%vn",err)
        return
    }
    defer file.Close() //關閉檔案,為了避免檔案洩露和忘記寫關閉檔案
    //讀取檔案內容
    var qiepian = make([]byte,128) //做一個大小為128位元組的切片
    n, err := file.Read(qiepian) //file.Read裡面是一個切片.如果讀取成功,那麼值宣告變數n並同時賦值給n。
    //判斷
    if err != nil{ //if err != nil 意思是如果err不為空,那麼就說明err有錯誤值,列印讀取錯誤。如果為空,說明err沒有錯誤值,列印讀取成功
        fmt.Printf("讀取檔案錯誤,錯誤值為:%vn",err)
        return
    }
    fmt.Printf("讀取檔案成功,檔案位元組大小為:%dn",n)
    fmt.Println(string(qiepian))
}

但是如果檔案的位元組大小大於128呢?

如果檔案有1W個位元組,但是我們設定的一次只能讀取128個,怎麼樣才能全部讀取檔案內容?

用迴圈讀取,一次讀128,直到讀完。

func readall(){
    //開啟檔案
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對於同目錄下。
    if err != nil{
        fmt.Printf("開啟檔案失敗,err:%vn",err)
        return
    }
    defer file.Close() //關閉檔案,為了避免檔案洩露和忘記寫關閉檔案
    
    //讀取檔案內容
    for {
        var qiepian = make([]byte,128) //做一個大小為128位元組的切片
        n, err := file.Read(qiepian) //file.Read裡面是一個切片.如果讀取成功,那麼值宣告變數n並同時賦值給n。
        if err == io.EOF{ //EOF表示 end of file,就是檔案的末尾,這個判斷意思就是,讀到檔案末尾的時候,將當前讀了多少位元組列印出來並退出
            //把當前讀了多少位元組的資料列印出來,然後退出
            fmt.Println(string(qiepian))
            return
        }
        //判斷
        if err != nil{ //if err != nil 意思是如果err不為空,那麼就說明err有錯誤值,列印讀取錯誤。如果為空,說明err沒有錯誤值,列印讀取成功
            fmt.Printf("讀取檔案錯誤,錯誤值為:%vn",err)
            return
        }
        fmt.Printf("讀取檔案成功,檔案位元組大小為:%dn",n)
        fmt.Println(string(qiepian[:n]))
    }
}
func main(){
    readall()
}

但是這樣寫,有點太麻煩。

基於此,使用go語言中的內建包,buffio和ioutil來讀取

buffio操作:

是在file基礎上封裝了一層IP。

先把磁碟的內容讀到緩衝區,然後再讀到程式碼中去。

寫入是先將寫入的內容寫到緩衝區,然後再寫到磁碟中去。

func readBybuffio(){
    //開啟檔案
    file, err := os.Open("./test.txt") //只是用來讀的時候,用os.Open。相對路徑,針對於同目錄下。
    if err != nil{
        fmt.Printf("開啟檔案失敗,err:%vn",err)
        return
    }
    defer file.Close() //關閉檔案,為了避免檔案洩露和忘記寫關閉檔案

    //使用buffio讀取檔案內容
    reader := bufio.NewReader(file) //建立新的讀的物件
    for {
        line , err := reader.ReadString('n') //注意是字元,換行符。
        if err == io.EOF{ 
            fmt.Println("檔案讀完了")
            break
        }
        if err != nil{ //錯誤處理
            fmt.Printf("讀取檔案失敗,錯誤為:%v",err)
            return
        }
        fmt.Println(line)
    }   
}

func main(){
    readBybuffio()
}

ioutil讀取整個檔案:

//ioutuil
func readByioutil(){
    iot,err := ioutil.ReadFile("./test.txt") //讀取檔案
    if err != nil{ //做錯誤判斷
        fmt.Printf("讀取檔案錯誤,錯誤為:%vn",err)
        return
    }
    fmt.Println(string(iot)) //列印檔案內容
}

所以我們可以得知,go語言中讀取檔案的三種方法。

第一種,我們可以使用切片的形式,客製化一次讀取檔案的多少位元組並用for迴圈來讀取檔案的內容。

第二種,我們可以使用go語言內建的buffio包來一行一行的讀取檔案的內容。

第三種,我們可以使用go語言內建的ioutil包來讀取整個檔案的所有內容。

檔案寫入操作

os.OpenFile()函數能夠以指定模式開啟檔案,從而實現檔案寫入相關功能。

Write和WriteString寫入操作

package main

import (
    "fmt"
    "os"
)

//檔案寫入
func write(){
    //os.O_CREATE:建立
    //os.O_WRONLY:只寫
    //os.O_APPEND:追加
    //os.O_RDONLY:唯讀
    //os.O_RDWR:讀寫
    //os.O_TRUNC:清空

    //0644:檔案的許可權
    //如果沒有test.txt這個檔案那麼就建立,並且對這個檔案只進行寫和追加內容。
    file,err := os.OpenFile("./test.txt",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
    if err != nil{
        fmt.Printf("檔案錯誤,錯誤為:%vn",err)
        return
    }
    defer file.Close()
    str := "你好啊n"
    file.Write([]byte(str)) //將str字串的內容寫到檔案中,強制轉換為byte,因為Write接收的是byte。
    file.WriteString("Hello") //寫字串
}
func main(){
    write()
}

使用buffio內建包來讀檔案

bufio.NewWriter: 先往緩衝區寫,然後才寫到磁碟中去。

func buffiowrite(){
    file,err := os.OpenFile("./gch.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    if err != nil{
        fmt.Printf("開啟檔案失敗,錯誤為:%vn",err)
        return
    }
    defer file.Close() //關閉檔案
    
    writer := bufio.NewWriter(file) //往檔案裡面寫入內容,得到了一個writer物件
    for i := 0; i <10; i++ { //迴圈寫入10行
        writer.WriteString("testn") //將資料寫入快取
    }
    writer.Flush() //將快取中內容的寫入檔案
}

第三種寫入檔案方法:ioutil.WriteFile

func ioutilWrite(){
    str := "Hello Golang!"
    err := ioutil.WriteFile("./ioutil.txt",[]byte(str),0664)//接收檔名,位元組型別的資料,檔案的許可權
    if err != nil{
        fmt.Printf("開啟檔案失敗,錯誤為:%vn",err)
        return
    }
}

總結

到此這篇關於Go讀取檔案與寫入檔案的三種方法操作的文章就介紹到這了,更多相關Go讀取檔案與寫入檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com