前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go读文件的几种姿势,你喜欢哪一种?

Go读文件的几种姿势,你喜欢哪一种?

作者头像
公众号: 云原生生态圈
发布2021-07-15 15:31:50
15.4K0
发布2021-07-15 15:31:50
举报
文章被收录于专栏:云原生生态圈

读取文件是程序员日常工作中最常见的任务之一。您可以根据需要以不同的方式进行操作。在本教程中,我们告诉你如何一次读取整个文件、一行行读取、一字一句读取文件、以及分块去读。所有这些方法在 Go ? 中都非常简单。

读取整个文件

在 Go 中读取文本或二进制文件的最简单方法是使用os[1]包中的ReadFile()函数。此函数将文件的全部内容读到一个byte切片,因此在尝试读取大文件时应该注意 - 在这种情况下,您应该逐行分块读取文件。对于小文件,这种方式绰绰有余。

“如果您使用的是 1.16 之前的 Go 版本,您将ReadFile()`ioutil`[2]包中找到该功能。

代码语言:javascript
复制
package main

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

func main() {
    content, err := os.ReadFile("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(content))
}

输出:

代码语言:javascript
复制
Hello World!
This is txt file read by Go!

逐行读取文件

要逐行读取文件,我们可以使用比较方便的bufio.Scanner结构。它的构造函数NewScanner()接受一个打开的文件(记住在操作完成后关闭文件,例如通过 defer语句),并让您通过Scan()Text()方法读取后续行。使用Err()方法,您可以检查文件读取过程中遇到的错误。

代码语言:javascript
复制
package main

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

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    // read the file line by line using scanner
    scanner := bufio.NewScanner(f)

    for scanner.Scan() {
        // do something with a line
        fmt.Printf("line: %s\n", scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

输出:

代码语言:javascript
复制
line: Hello World!
line: This is txt file read by Go!

逐字的读取文件

逐字读取文件与逐行读取几乎相同。您只需要将Scannersplit功能从**默认的ScanLines()**函数更改为ScanWords()即可。

代码语言:javascript
复制
package main

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

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    // read the file word by word using scanner
    scanner := bufio.NewScanner(f)
    scanner.Split(bufio.ScanWords)

    for scanner.Scan() {
        // do something with a word
        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

输出:

代码语言:javascript
复制
Hello
World!
This
is
txt
file
read
by
Go!

分块读取文件

当你有一个非常大的文件或不想将整个文件存储在内存中时,您可以通过固定大小的块读取文件。在这种情况下,您需要创建一个指定大小chunkSize的byte切片作为缓冲区,用于存储后续读取的字节。使用Read()方法加载文件数据的下一个块。当发生io.EOF错误,指示文件结束,读取循环结束。

代码语言:javascript
复制
package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

const chunkSize = 10

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    buf := make([]byte, chunkSize)

    for {
        n, err := f.Read(buf)
        if err != nil && err != io.EOF {
            log.Fatal(err)
        }

        if err == io.EOF {
            break
        }

        fmt.Println(string(buf[:n]))
    }
}

输出:

代码语言:javascript
复制
Hello Worl
d!
This is
 txt file 
read by Go
!

参考资料

[1]

os: https://golang.org/pkg/os

[2]

ioutil: https://golang.org/pkg/io/ioutil

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 读取整个文件
  • 逐行读取文件
  • 逐字的读取文件
  • 分块读取文件
  • 参考资料
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档