Golang如何读取本地文件_Golang文件读取常用方法

8次阅读

os.ReadFile适合读取≤几MB的静态小文件,如配置、jsON、YAML等,自动管理文件资源;大文件或需逐行处理时应选bufio.Scanner或bufio.Reader,避免OOM和panic。

Golang如何读取本地文件_Golang文件读取常用方法

小文件直接用 os.ReadFile,大文件或需逐行处理时必须用 bufio.Scannerbufio.Reader,否则容易 OOM 或 panic。

什么时候该用 os.ReadFile

它适合读取 ≤几 MB 的配置、json、YAML、模板等静态小文件。内部自动 Open → 读取 → Close,不手动管理资源,也不用担心漏关文件描述符。

  • 函数签名是 os.ReadFile(filename String) ([]byte, Error),返回原始字节切片,转字符串只需 string(data)
  • 不处理编码:UTF-8 没问题;GBK/Shift-JIS 等需用 golang.org/x/text/encoding 转换,否则中文变 ???
  • 错误检查不能省——比如文件权限不足时返回 permission denied,路径错则报 no such file or Directory
  • 别在日志分析、csv 导入等场景硬套它:100MB 日志文件会直接吃光内存,且没提供任何流控能力

为什么 bufio.Scanner 是文本类大文件的首选?

它专为“人类可读文本”设计,自动按行切分、剥离换行符,内存占用稳定(默认缓冲区仅 64KB),适合日志解析、CSV 行处理、配置片段提取等。

  • 必须配 defer f.Close()os.Open 返回的 *os.File 不会自动关闭
  • 单行超长(>64KB)会触发 scanner: Token too long 错误;修复方式:调用 scanner.Buffer(make([]byte, 0), 1 扩容到 1MB
  • scanner.Text() 返回的是不含 n 的字符串,若需保留换行或处理空字节,请换 bufio.Reader
  • 别在循环里忽略 scanner.Err() —— 文件中途被删、磁盘满等错误只在这里暴露,漏判会导致静默失败

遇到二进制、超长行或自定义分隔符怎么办?

这时候 bufio.Scanner 就不够用了。bufio.Reader 提供更底层控制:可指定分隔符、读固定长度、支持 peek、兼容空字节,是处理协议文件、打包格式、日志归档等场景的可靠选择。

立即学习go语言免费学习笔记(深入)”;

  • reader.ReadString('n')reader.ReadBytes('') 替代 Scan(),避免单行限制
  • 读取固定头信息(如 PNG 文件头 8 字节)推荐 io.ReadFull(reader, headerBuf),它确保读满,不会因 EOF 提前返回
  • 若要边读边解密/校验/压缩,直接拿 *os.Fileio.Reader 传给 crypto/aeshash/crc32,比先读进内存再处理更安全
  • 注意:所有 Read* 方法都可能只读部分数据,必须检查返回的 nerrio.EOF 是正常结束信号,其他 err 需中断流程

真正容易出事的不是选错函数,而是把 os.ReadFile 当万能锤去读日志,或者在 Scanner 里忘了扩容缓冲区导致线上 panic;还有人用 fmt.Fscanf 解析 CSV,结果字段含逗号就全乱了——工具本身没错,错在没看清它的适用边界。

text=ZqhQzanResources