• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

如何使用Go语言读/写文件?

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我是Go语言新人,想在普通文件中进行读取和写入。

我可以得到inFile, _ := os.Open(INFILE, 0, 0),但实际上获取文件内容是遇到了困难,因为read函数将[]byte作为参数。

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

 

 

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

非常简单!但只有当你确定你没有处理大文件时才使用它。

 

参考资料

  • How to read/write from/to file using Go?

 


鲜花

握手

雷人

路过

鸡蛋
专题导读
上一篇:
Google Adsense不合规网页已整改发布时间:2022-05-14
下一篇:
如何在Go中生成固定长度的随机字符串?发布时间:2022-05-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap