Go文件操作

[1] 将整个文件读取到内存

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    data, err := ioutil.ReadFile("./test.txt")
    if err != nil {
        fmt.Println("File reading error", err)
        return
    }
    fmt.Println("Contents of file:", string(data))
}

[2] 分块读取文件

package main

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

func main() {
    file, err := os.Open("./test.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()
    //
    // 以3个字节的块为单位读取文件
    //
    reader := bufio.NewReader(file) // 新建一个缓冲读取器
    buff := make([]byte, 3)
    for {
        // Read方法会读取len(buff)个字节,并返回所读取的字节数
        // 当到达文件最后时,它会返回一个EOF错误
        n, err := reader.Read(buff)
        if err != nil {
            fmt.Println("Error reading file:", err)
            break
        }
        fmt.Println(string(buff[:n]))
    }
}

[3] 逐行读取文件

package main

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

func main() {
    file, err := os.Open("./test.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()
    //
    // 扫描文件并逐行读取
    //
    s := bufio.NewScanner(file)
    // Scan方法读取文件的下一行,如果可以读取,就可用Text方法
    // Scan返回false时,除非已经到达文件末尾(此时Err()返回nil)
    // 否则Err()就会返回扫描过程中出现的错误
    for s.Scan() {
        fmt.Println(s.Text())
    }
    err = s.Err()
    if err != nil {
        log.Fatal(err)
    }
}