日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go讀取文件與寫入文件的三種方法操作指南_Golang

作者:心鴿 ? 更新時間: 2022-11-08 編程語言

打開和關閉文件操作:

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:%v\n",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:%v\n",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("讀取文件錯誤,錯誤值為:%v\n",err)
        return
    }
    fmt.Printf("讀取文件成功,文件字節大小為:%d\n",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:%v\n",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("讀取文件錯誤,錯誤值為:%v\n",err)
            return
        }
        fmt.Printf("讀取文件成功,文件字節大小為:%d\n",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:%v\n",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("讀取文件錯誤,錯誤為:%v\n",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("文件錯誤,錯誤為:%v\n",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("打開文件失敗,錯誤為:%v\n",err)
        return
    }
    defer file.Close() //關閉文件
    
    writer := bufio.NewWriter(file) //往文件里面寫入內容,得到了一個writer對象
    for i := 0; i <10; i++ { //循環寫入10行
        writer.WriteString("test\n") //將數據寫入緩存
    }
    writer.Flush() //將緩存中內容的寫入文件
}

第三種寫入文件方法:ioutil.WriteFile

func ioutilWrite(){
    str := "Hello Golang!"
    err := ioutil.WriteFile("./ioutil.txt",[]byte(str),0664)//接收文件名,字節類型的數據,文件的權限
    if err != nil{
        fmt.Printf("打開文件失敗,錯誤為:%v\n",err)
        return
    }
}

總結

原文鏈接:https://blog.csdn.net/lvjie13450/article/details/121855625

欄目分類
最近更新