Go读写TXT文件
一、读取 TXT 文件
1. 一次性读取整个文件(推荐小文件)
go
package main
import (
"fmt"
"os"
)
func main() {
// 方式1:os.ReadFile(Go 1.16+ 推荐)
content, err := os.ReadFile("test.txt")
if err != nil {
fmt.Println("读取失败:", err)
return
}
fmt.Println(string(content))
}
2. 使用 bufio.Scanner(按行读取,最常用,推荐大文件)
go
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("big.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
// 默认缓冲区 64KB,若单行超长需扩大
scanner.Buffer(make([]byte, 1024*1024), 1024*1024) // 最大 1MB
lineNum := 0
for scanner.Scan() {
lineText := scanner.Text() // 返回 string(会拷贝)
lineNum++
// 打印每行内容
fmt.Println(lineText)
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
fmt.Println("总行数:", lineNum)
}
注意 :
bufio.Scanner默认单行最大 64KB,如果行很长需要scanner.Buffer(make([]byte, 1024*1024), 1024*1024)调大缓冲。
二、写入 TXT 文件
1. 一次性写入
go
package main
import (
"os"
)
func main() {
// 会覆盖原文件内容
// 权限 0644:所有者可读写,其他用户只读
err := os.WriteFile("output.txt", []byte("Hello, 世界!\n"), 0644)
if err != nil {
panic(err)
}
}
2. 追加写入
go
package main
import (
"os"
)
func main() {
file, err := os.OpenFile("output.txt",os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer file.Close()
file.WriteString("追加的一行\n")
}
3. 使用 bufio.Writer(逐行写入,推荐大文件)
go
package main
import (
"bufio"
"log"
"os"
//"strconv"
)
func main() {
file, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
write := bufio.NewWriterSize(file, 1024*1024) // 1MB 缓冲
defer write.Flush() // 一定要 Flush,否则最后一段数据丢失
for i := 0; i < 10000; i++ {
// fmt.Fprintln(write, i) // 简单但慢
write.WriteString("hello\n") // 较快
//write.WriteString(strconv.Itoa(i)) // 更快:避免反射
//write.WriteByte('\n')
}
// 出错时可提前 Flush 并检查 err
}
三、常见的 OpenFile 标志
| 标志 | 说明 |
|---|---|
os.O_RDONLY |
只读 |
os.O_WRONLY |
只写 |
os.O_RDWR |
读写 |
os.O_CREATE |
不存在则创建 |
os.O_TRUNC |
打开时清空 |
os.O_APPEND |
追加模式 |
常用组合:
- 覆盖写:
os.O_WRONLY|os.O_CREATE|os.O_TRUNC - 追加写:
os.O_WRONLY|os.O_CREATE|os.O_APPEND
四、选型建议
| 场景 | 推荐方式 |
|---|---|
| 小文件全量读取 | os.ReadFile |
| 大文件按行读 | bufio.Scanner |
| 小量内容写入 | os.WriteFile |
| 大文件/循环写 | bufio.Writer + Flush |
| 二进制复制 | io.Copy |
关键提醒:
- 一定要
defer file.Close()避免文件句柄泄漏。 - 用
bufio.Writer时别忘了Flush()。 - 用
bufio.Scanner处理超长行要调整 buffer 大小。