Go語言文件操作

本文主要介紹了Go語言中文件讀寫的相關(guān)操作。

文件是什么?

計(jì)算機(jī)中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。

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

os.Open()函數(shù)能夠打開一個文件,返回一個*File和一個err。對得到的文件實(shí)例調(diào)用close()方法能夠關(guān)閉文件。

package main

import (
    "fmt"
    "os"
)

func main() {
    // 只讀方式打開當(dāng)前目錄下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    // 關(guān)閉文件
    file.Close()
}

為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。

讀取文件

file.Read()

基本使用

Read方法定義如下:

func (f *File) Read(b []byte) (n int, err error)

它接收一個字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯誤,讀到文件末尾時(shí)會返回0io.EOF。 舉個例子:

func main() {
    // 只讀方式打開當(dāng)前目錄下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    defer file.Close()
    // 使用Read方法讀取數(shù)據(jù)
    var tmp = make([]byte, 128)
    n, err := file.Read(tmp)
    if err == io.EOF {
        fmt.Println("文件讀完了")
        return
    }
    if err != nil {
        fmt.Println("read file failed, err:", err)
        return
    }
    fmt.Printf("讀取了%d字節(jié)數(shù)據(jù)\n", n)
    fmt.Println(string(tmp[:n]))
}

循環(huán)讀取

使用for循環(huán)讀取文件中的所有數(shù)據(jù)。

func main() {
    // 只讀方式打開當(dāng)前目錄下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    defer file.Close()
    // 循環(huán)讀取文件
    var content []byte
    var tmp = make([]byte, 128)
    for {
        n, err := file.Read(tmp)
        if err == io.EOF {
            fmt.Println("文件讀完了")
            break
        }
        if err != nil {
            fmt.Println("read file failed, err:", err)
            return
        }
        content = append(content, tmp[:n]...)
    }
    fmt.Println(string(content))
}

bufio讀取文件

bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

// bufio按行讀取示例
func main() {
    file, err := os.Open("./xx.txt")
    if err != nil {
        fmt.Println("open file failed, err:", err)
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        line, err := reader.ReadString('\n') //注意是字符
        if err == io.EOF {
            if len(line) != 0 {
                fmt.Println(line)
            }
            fmt.Println("文件讀完了")
            break
        }
        if err != nil {
            fmt.Println("read file failed, err:", err)
            return
        }
        fmt.Print(line)
    }
}

ioutil讀取整個文件

io/ioutil包的ReadFile方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。

package main

import (
    "fmt"
    "io/ioutil"
)

// ioutil.ReadFile讀取整個文件
func main() {
    content, err := ioutil.ReadFile("./main.go")
    if err != nil {
        fmt.Println("read file failed, err:", err)
        return
    }
    fmt.Println(string(content))
}

文件寫入操作

os.OpenFile()函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    ...
}

其中:

name:要打開的文件名 flag:打開文件的模式。 模式有以下幾種:

模式 含義
os.O_WRONLY 只寫
os.O_CREATE 創(chuàng)建文件
os.O_RDONLY 只讀
os.O_RDWR 讀寫
os.O_TRUNC 清空
os.O_APPEND 追加

perm:文件權(quán)限,一個八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。

Write和WriteString

func main() {
    file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("open file failed, err:", err)
        return
    }
    defer file.Close()
    str := "hello 上海"
    file.Write([]byte(str))       //寫入字節(jié)切片數(shù)據(jù)
    file.WriteString("hello 小王子") //直接寫入字符串?dāng)?shù)據(jù)
}

bufio.NewWriter

func main() {
    file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("open file failed, err:", err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString("hello上海\n") //將數(shù)據(jù)先寫入緩存
    }
    writer.Flush() //將緩存中的內(nèi)容寫入文件
}

示例


package main

import (
    "bufio"
    "fmt"
    "os"
)

func useScan() {
    var s string
    fmt.Print("請輸入內(nèi)容:")
    fmt.Scanln(&s)
    fmt.Printf("你輸入的內(nèi)容是:%s\n", s)
}

func useBufio() {
    var s string
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("請輸入內(nèi)容:")
    s, _ = reader.ReadString('\n')
    fmt.Printf("你輸入的內(nèi)容是:%s\n", s)
}

func main() {
    //useScan()
    useBufio()
}

ioutil.WriteFile

func main() {
    str := "hello 上海"
    err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
    if err != nil {
        fmt.Println("write file failed, err:", err)
        return
    }
}

在文件中間插入內(nèi)容

package main

import (
    "fmt"
    "io"
    "os"
)

func middleInsert() {
    // 打開要操作的文件
    fileObj, err := os.OpenFile("./mi.txt",os.O_RDWR,0644)
    if err != nil {
        fmt.Printf("open file failed, err:%v\n", err)
        return
    }
    // 借助臨時(shí)文件
    tmpFile, err := os.OpenFile("./mi.tmp", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
    if err != nil {
        fmt.Printf("create tmp file failed, err:%v\n", err)
        return
    }
    // 讀取源文件寫入臨時(shí)文件
    var ret [1]byte
    n, err := fileObj.Read(ret[:])
    if err != nil {
        fmt.Printf("read from file failed, err:%v\n", err)
        return
    }
    // 寫入臨時(shí)文件
    tmpFile.Write(ret[:n])
    // 再寫入要插入的內(nèi)容
    var s []byte
    s = []byte{'w'}
    tmpFile.Write(s)
    // 緊接著把源文件后續(xù)的內(nèi)容寫入臨時(shí)文件
    var x [1024]byte
    for {
        n, err := fileObj.Read(x[:])
        if err == io.EOF {
            tmpFile.Write(x[:n])
            break
        }
        if err != nil {
            fmt.Printf("read from file failed, err:%v\n", err)
            return
        }
        tmpFile.Write(x[:n])
    }
    // 源文件后續(xù)的也寫入了臨時(shí)文件,關(guān)閉源文件
    fileObj.Close()
    tmpFile.Close()
    os.Rename("./mi.tmp","./mi.txt")

    


}

func main() {
    middleInsert()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要介紹了Go語言中文件讀寫的相關(guān)操作。 文件是什么? 計(jì)算機(jī)中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集...
    吳佳浩閱讀 531評論 0 4
  • 文件的打開和關(guān)閉 os包中提供了方法叫做Open,就是專門用于打開某一個文件的 注意點(diǎn):如果文件不存在不會自動創(chuàng)建...
    AuglyXu閱讀 1,488評論 0 6
  • Go語言操作文件 文件的打開與關(guān)閉 文件的打開在Go語言的os包中提供了一個函數(shù), 叫做Open, 就是專門用于打...
    喝酸奶要舔蓋__閱讀 309評論 0 0
  • 如何打開和關(guān)閉文件 在Go語言中的OS包提供了一個函數(shù),叫做open,就是專門用來打開文件的 在Go語言中OS包中...
    超級皮波9閱讀 677評論 0 0
  • 文件讀取 讀寫參數(shù) 文件打開模式 權(quán)限控制 讀取例子 os.Open || os.OpenFile readlin...
    程序員小飯閱讀 512評論 0 1

友情鏈接更多精彩內(nèi)容