Golang 使用os 库的 ReadFile() 读文件最佳实践

 

前言

在 Go 中,os 库的ReadFile()方法经常用作读文件,相比其他这个方法很方便,无需关心 close 文件等一些工作。

下面列出三种常见的读文件场景:

 

1. 读取整个文件到内存中

使用 os 库的 ReadFile() 可以把整个文件读到内存中,在日常开发中,这是读文件使用频率最多的方法,也是最基本一个函数。下面代码展示了如何使用这个函数。

package main

import (
 "log"
 "os"
)

func main() {
 data, err := os.ReadFile("./file.txt")
 if err != nil {
    log.Fatalf("File reading error: %v", err)
 }
 log.Printf("Contents of file: %s", string(data))
}

 

2. 读取特定字节数据到内存中

当文件过大时,读取整个文件到内存中会把内存打爆,鉴于这种情况,我们可以把整个文件分成特定 chunks,也就是块,然后分块读取,下面代码展示了把 3 个 byte 组成一个 chunk,然后再读取。

package main

import (
 "bufio"
 "io"
 "log"
 "os"
)
func main() {
 f, err := os.Open("./file.txt")
 if err != nil {
    log.Fatal(err)
 }
 defer f.Close()

 // 初始化 reader 读文件
 r := bufio.NewReader(f)
 // 初始化 3 个 byte slice,每次读取 3 个 byte
 b := make([]byte, 3)
 // 循环读取,直到读到文件的结尾,
 for {
    n, err := r.Read(b)
    if err == io.EOF {
       break
    }
    if err != nil {
       log.Fatalf("Error reading file: %v", err)
       break
    }
    log.Printf("the Content is: %s", string(b[0:n]))
 }
}

 

3. 按行读取文件到内存中

我们也可以按行分割整个文件,然后一行行读取到内存中,这种方法也可以减少内存的压力

package main

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

func main() {
  f, err := os.Open("./file.txt")
  if err != nil {
      log.Fatal(err)
  }

  defer f.Close()

  // 以这个文件为参数,创建一个 scanner
  s := bufio.NewScanner(f)
  // 扫描每行文件,按行读取
  for s.Scan() {
      log.Printf("the Content is: %s", s.Text())
  }
  err = s.Err()
  if err != nil {
      log.Fatal(err)
  }
}

关于Golang 使用os 库的 ReadFile() 读文件最佳实践的文章就介绍至此,更多相关Golang读文件内容请搜索编程宝库以前的文章,希望以后支持编程宝库

 正文如果你尝试学习Go,或者你正在为自己建立一个Poc或者一个玩具项目,这个项目布局是没有啥必要的,从一些简单的事情开始(一个main文件绰绰有余)。当有更多的人参与这个项目的时候,你讲需要更多的结构 ...