章节

14.3 分片读取文件

本篇学习使用 File.Read 分片读取文件,并能正确处理 EOF。

分片读取文件

概念说明

分片读取是指每次读取固定大小的一段内容。
它适合读取较大的文件,避免一次性把全部内容加载到内存。

读取到文件末尾时,Read 会返回 io.EOF
io.EOF 表示正常结束,不应当成普通错误直接 panic。

语法/规则

  1. 使用 os.Open(path) 打开文件。
  2. 使用 file.Read(buffer) 把数据读入缓冲区。
  3. n 表示本次实际读取的字节数。
  4. 处理内容时必须使用 buffer[:n],不能直接用整个 buffer。
  5. 遇到 io.EOF 时结束循环。

分片读取示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

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

func main() {
	path := "data.txt"
	err := os.WriteFile(path, []byte("abcdef"), 0644)
	if err != nil {
		panic(err)
	}
	defer os.Remove(path)

	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	buffer := make([]byte, 2) // 每次最多读取 2 个字节
	for {
		n, err := file.Read(buffer)
		if n > 0 {
			fmt.Println(string(buffer[:n])) // 只处理本次真正读到的数据
		}
		if err == io.EOF {
			break // 读到文件末尾,正常结束
		}
		if err != nil {
			panic(err)
		}
	}
}

输出结果:

1
2
3
ab
cd
ef

常见错误

  1. 直接使用整个 buffer,导致最后一次读取混入旧数据。
  2. io.EOF 当成异常 panic,实际它表示文件读取结束。
  3. 打开文件后忘记 Close,导致文件句柄泄漏。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字