Go读写TXT文件

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

关键提醒:

  1. 一定要 defer file.Close() 避免文件句柄泄漏。
  2. 用 bufio.Writer 时别忘了 Flush()。
  3. 用 bufio.Scanner 处理超长行要调整 buffer 大小。

相关推荐
我是唐青枫6 小时前
Kotlin Delegation 委托详解
开发语言·kotlin
qq_406981037 小时前
共享变量一 关于extern与const
开发语言·c++
FRing037 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel7 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
AI入职记8 小时前
AI 代码审查召回率实测:20 个骗过单元测试的变异体,抓到 13 个
后端
浮链序8 小时前
别让 AI 客服把用户当猴耍:百来行 Python 把「转人工」做成一条高可用链路
后端
属于自己的天空8 小时前
Claude Code 插件完全指南:官方市场怎么用,怎么自己写(v2.1.269+)
后端
Tokenfree8 小时前
给大模型调用加一个熔断器:60 行代码,三个阈值
后端
Jason_chen8 小时前
Linux 进程调度器深入解析与实时性优化指南(基于 Linux 5.10+)
后端
136096757238 小时前
三个 Agent 干同一个活,职责边界到底该怎么划
后端