go 文件读写

go 文件读写有很多方式,这里我们选择ioutil包

把文件读取到内存

package main

import (
    "io/ioutil"
    "fmt"
)

func main() {
    data,err := ioutil.ReadFile("a.txt")  #这里返回的data是一个字节切片
    if err!=nil{
        fmt.Println("File reading error", err)
    }
    fmt.Println(string(data))
}

讲文件绑定在二进制文件中

packr 会把静态文件(例如 .txt 文件)转换为 .go 文件,接下来,.go 文件会直接嵌入到二进制文件中。packer 非常智能,在开发过程中,可以从磁盘而非二进制文件中获取静态文件。在开发过程中,当仅仅静态文件变化时,可以不必重新编译。

package main

import (
    "fmt"

    "github.com/gobuffalo/packr"
)

func main() {
    box := packr.NewBox("../a.txt")
    data := box.String("test.txt")
    fmt.Println("Contents of file:", data)
}

逐行读取文件

package main

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

func main() {
    //fptr := flag.String("fpath", "test.txt", "file path to read from")
    //flag.Parse()

    f, err := os.Open(“a.txt”)   //因为bufio需要的是一个*os.File类型,所以我们换个方式读取,稍后再介绍一下
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = f.Close(); err != nil {
        log.Fatal(err)
    }
    }()
    s := bufio.NewScanner(f)
    for s.Scan() {
        fmt.Println(s.Text())
    }
    err = s.Err()
    if err != nil {
        log.Fatal(err)
    }
}

分块读取文件

当文件非常大时,尤其在 RAM 存储量不足的情况下,把整个文件都读入内存是没有意义的。更好的方法是分块读取文件。这可以使用 bufio包来完成。

package main

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

func main() {
    //fptr := flag.String("fpath", "test.txt", "file path to read from")
    //flag.Parse()

    f, err := os.Open("a.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = f.Close(); err != nil {
            log.Fatal(err)
        }
    }()
    r := bufio.NewReader(f)
    b := make([]byte, 3)
    for {
        _, err := r.Read(b)
        if err != nil {
            fmt.Println("Error reading file:", err)
            break
        }
        fmt.Println(string(b))
    }
}

猜你喜欢

转载自www.cnblogs.com/tigerzhouv587/p/11460542.html