栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Go从文件读/写文件?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Go从文件读/写文件?

让我们列出与Go 1兼容的清单,其中列出了在Go中读写文件的所有方式。

由于文件API最近已更改,并且大多数其他答案不适用于Go1。他们也错过了

bufio
重要的恕我直言。

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

从基础开始

package mainimport (    "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.Open
并且
os.Create
它们是方便的包装器
os.OpenFile
。我们通常不需要
OpenFile
直接致电。

注意处理EOF。

Read
尝试填充
buf
每个调用,并
io.EOF
在到达文件末尾时返回错误。在这种情况下
buf
仍将保留数据。随之而来的调用
Read
返回零作为读取的字节数,并且与
io.EOF
错误相同。任何其他错误都会导致恐慌。

使用

bufio

package mainimport (    "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
它为我们提供了一个很好的API,可轻松灵活地进行读写,同时还可以处理后台缓冲,因此非常有用。

使用

ioutil

package mainimport (    "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)    }}

非常简单!但是,只有在确定不处理大文件时才使用它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号