如何使用golang从/到文件读/写?

前端之家收集整理的这篇文章主要介绍了如何使用golang从/到文件读/写?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直试图学习Go我自己,但我一直在努力尝试从普通文件读取和写入。

我可以得到远在文件,_:= os.Open(INFILE,0,0);但实际上获取文件内容没有意义,因为读取函数以一个[]字节作为参数。

func (file *File) Read(b []byte) (n int,err Error)@H_403_4@
让我们在Go中创建一个Go 1兼容的读取和写入文件的方式列表。

因为文件API最近更改,大多数其他答案不能使用Go 1.他们也错过bufio这是重要的IMHO。

在以下示例中,我通过从文件读取并写入目标文件来复制文件

从基础开始

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)
        }
    }
}@H_403_4@ 
 

这里我使用os.Open和os.Create,它们是os.OpenFile周围方便的包装器。我们通常不需要直接调用OpenFile。

通知处理EOF。读取尝试在每次调用时填充buf,如果到达文件结尾,则返回io.EOF作为错误。在这种情况下,buf仍然保存数据。随后对读取的读取返回零,因为读取的字节数与io.EOF相同,为错误。任何其他错误都会导致崩溃。

使用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,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)
    }
}@H_403_4@ 
 

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)
    }
}@H_403_4@ 
 

易如反掌!但使用它,只有当你确信你不是处理大文件

猜你在找的Go相关文章