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

目录
  • 前言
  • 1. 读取整个文件到内存中
  • 2. 读取特定字节数据到内存中
  • 3. 按行读取文件到内存中

前言

在 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读文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang pprof 监控goroutine thread统计原理详解

    目录 引言 http 接口暴露的方式 goroutine profile 输出信息介绍 threadcreate 输出信息介绍 程序代码暴露指标信息 统计原理介绍 goroutine fetch 函数实现 threadcreate fetch 函数实现 总结 引言 在之前 golang pprof监控 系列文章里我分别介绍了go trace以及go pprof工具对memory,block,mutex这些维度的统计原理,今天我们接着来介绍golang pprof工具对于goroutine 和th

  • 深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)

    日志处理经常有以下几个需求: 1.不同级别的日志输出到不同的日志文件中. 2.日志文件按照文件大小或日期进行切割存储,以避免单一日志文件过大. 3.日志使用简单方便,一次定义全局使用. 建议使用使用Uber-go的Zap Logger,大神李文周大博客已经说的非常明确了,请先参考李老师的博客: https://www.liwenzhou.com/posts/Go/zap/ 问题二和问题三需要补充描述: 一.日志按照级别分文件切割存储 1.1 首先实现两个判断日志等级的interface info

  • 浅谈GoLang几种读文件方式的比较

    GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main import( "fmt" "os" "flag" "io" "io/ioutil" "bufio" "time" ) func read1(path string)s

  • golang使用excelize库操作excel文件的方法详解

    目录 1. 准备工作 2. 使用excelize读取excel文件 3. 使用excelize将数据写入excel文件 4. 参考资料: 总结 ​ 今天我们讲一下使用excelize操作excel,首先熟悉一下excel的文件构成,excel分为以下结构: ​ 1. excel文件,2. sheet页, 3. 行row, 4. 列col, 5. 项cell ​ 对应结构如下图: 1. 准备工作 我们读取的文件格式如上图所示, 我们先定义一个StockInfo结构来存储相应字段 type Stoc

  • Golang的os标准库中常用函数的整理介绍

    os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个error其实这个函数的真正实现用的syscall.Rename()然后通过MoveFile(from *uint16, to *uint16) (err error) = MoveFileW来重新命名 复制代码 代码如下: import (  "fmt"  "os" ) func main() {  e

  • Lua教程(十六):系统库(os库)

    Lua为了保证高度的可移植性,因此,它的标准库仅仅提供了非常少的功能,特别是和OS相关的库.但是Lua还提供了一些扩展库,比如Posix库等.对于文件操作而言,该库仅提供了os.rename函数和os.remove函数. 1. 日期和时间: 在Lua中,函数time和date提供了所有的日期和时间功能. 如果不带任何参数调用time函数,它将以数字形式返回当前的日期和时间.如果以一个table作为参数,它将返回一个数字,表示该table中所描述的日期和时间.该table的有效字段如下: prin

  • golang如何通过viper读取config.yaml文件

    目录 1.导入依赖包 2.编写yaml文件 3.编写读取yaml文件的go文件 4.使用config对象 5.viper源码分析 1.导入依赖包 import (     "github.com/spf13/viper" ) 2.编写yaml文件 放在conf目录下,文件名叫config.yaml # TODO  本地调试时放开 KubeSphere_URL: http://192.168.103.48:3188 # TODO 部署到环境时放开 #KubeSphere_URL: htt

  • golang图片处理库image基本操作

    目录 基本操作 读取 新建 保存 图片修改 转换 裁剪 缩放 基本操作 图片的基本读取与保存. 读取 图片读取和文件读取类似,需要先获取流: 注册图片的解码器(如:jpg则import _ "image/jpeg", png则import _ "image/png") 通过os.open打开文件获取流: 通过image.Decode解码流,获取图片: import _ "image/jpeg" func readPic() image.Image

  • 浅谈将JNI库打包入jar文件

    在Java开发时,我们有时候会接触到很多本地库,这样在对项目打包的时候我们不得不面临一个选择:要么将库文件与包好的jar文件放在一起:要么将库文件包入jar. 将一个不大的项目包成一个jar有诸多发布优势,本次将分享一个将JNI包入jar的方法. [实现思路] 将JNI库(dll.so等)包入jar后,我们无法通过路径来访问它们,而库的读取依赖一个java.library.path下对应名称的外部库文件,我们仅仅需要在调用JNI前将其由jar包释放出来,这类似于文件的拷贝过程. [部署位置的选取

  • 用python标准库difflib比较两份文件的异同详解

    [需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python的标准库difflib就能满足我们的需求. 下面这个脚本使用了difflib和argparse,argparse用于解析我们给此脚本传入的两个参数(即两份待比较的文件),由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差

  • python 读文件,然后转化为矩阵的实例

    代码流程: 1. 从文件中读入数据. 2. 将数据转化成矩阵的形式. 3. 对于矩阵进行处理. 具体的python代码如下: - 文件路径需要设置正确. - 字符串处理. - 字符串数组到 整型数组的转化.( nums = [int(x) for x in nums ]) - 矩阵的构造.(matrix = np.array(nums)) - numpy模块在矩阵处理上很有优势. 列表内容 # -*- coding: utf-8 -*- import numpy as np def readFi

随机推荐