當前位置: 首頁>>編程語言>>正文


如何使用Go語言讀/寫文件?

我是Go語言新人,想在普通文件中進行讀取和寫入。

我可以得到inFile, _ := os.Open(INFILE, 0, 0),但實際上獲取文件內容是遇到了困難,因為read函數將[]byte作為參數。

func (file *File) Read(b []byte) (n int, err Error)

 

Go語言讀寫文件

 

Go語言常用讀寫方法匯總

這裏列出在Go中讀取和寫入文件的所有常見方法。

在以下示例中,我們通過讀取文件並寫入目標文件來複製文件。

從基礎開始

package main

import (
    "io"
    "os"
)

func main() {
    // open input file
    fi, err := os.Open("input.txt")
    if err != nil {
        panic(err)
    }
    // close fi on exit and check for its returned error
    defer func() {
        if err := fi.Close(); err != nil {
            panic(err)
        }
    }()

    // open output file
    fo, err := os.Create("output.txt")
    if err != nil {
        panic(err)
    }
    // close fo on exit and check for its returned error
    defer func() {
        if err := fo.Close(); err != nil {
            panic(err)
        }
    }()

    // make a buffer to keep chunks that are read
    buf := make([]byte, 1024)
    for {
        // read a chunk
        n, err := fi.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if n == 0 {
            break
        }

        // write a chunk
        if _, err := fo.Write(buf[:n]); err != nil {
            panic(err)
        }
    }
}

在這裏,我使用了os.Openos.Create,它們是os.OpenFile的包裝器。我們通常不需要直接調用OpenFile

注意其中的EOF。 Read嘗試在每次調用時填充buf,如果到達文件末尾,則返回io.EOF作為錯誤。在這種情況下,buf仍將保存數據。隨後對Read的調用將返回零作為讀取的字節數,並將相同的io.EOF作為錯誤返回。任何其他錯誤都會導致一個panic錯誤。

使用bufio

package main

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

func main() {
    // open input file
    fi, err := os.Open("input.txt")
    if err != nil {
        panic(err)
    }
    // close fi on exit and check for its returned error
    defer func() {
        if err := fi.Close(); err != nil {
            panic(err)
        }
    }()
    // make a read buffer
    r := bufio.NewReader(fi)

    // open output file
    fo, err := os.Create("output.txt")
    if err != nil {
        panic(err)
    }
    // close fo on exit and check for its returned error
    defer func() {
        if err := fo.Close(); err != nil {
            panic(err)
        }
    }()
    // make a write buffer
    w := bufio.NewWriter(fo)

    // make a buffer to keep chunks that are read
    buf := make([]byte, 1024)
    for {
        // read a chunk
        n, err := r.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if n == 0 {
            break
        }

        // write a chunk
        if _, err := w.Write(buf[:n]); err != nil {
            panic(err)
        }
    }

    if err = w.Flush(); err != nil {
        panic(err)
    }
}

bufio在這裏隻是一個緩衝區,跟數據本身關係不大。在大多數其他情況下(特別是文本文件),bufio非常有用,它可以讓我們輕鬆靈活地讀取和寫入a nice API,同時它可以在後台處理緩衝。

使用ioutil

package main

import (
    "io/ioutil"
)

func main() {
    // read the whole file at once
    b, err := ioutil.ReadFile("input.txt")
    if err != nil {
        panic(err)
    }

    // write the whole body at once
    err = ioutil.WriteFile("output.txt", b, 0644)
    if err != nil {
        panic(err)
    }
}

非常簡單!但隻有當你確定你沒有處理大文件時才使用它。

go語言讀寫文件read/write

 

參考資料

 

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/4120.html,未經允許,請勿轉載。