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 大小。

相关推荐
hsfxuebao3 小时前
Hermes Agent进化篇:Skills、Hooks、Plugins、Cron
人工智能·后端
qq_401700413 小时前
Qt Signal Mapper:一堆按钮,怎么共用一个槽函数
开发语言·qt
蜗牛互联网3 小时前
Java HttpClient 调用 Gemini 图像理解与金额字段校验
java·开发语言·人工智能·后端·python
蜗牛互联网3 小时前
Python Responses API视觉输入与本地金额校验最小实现
java·开发语言·人工智能·后端·python
程序猿_极客3 小时前
【免费】分享一套优质的基于Java的智慧养老院管理系统的设计与实现(带可视化),源码+文档+视频详解(讲解)
java·spring boot·后端·养老院管理系统
czq_26867194874 小时前
Python打卡第34天
开发语言·python·机器学习
专业程序开发源4 小时前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
除不掉的灰色4 小时前
Go 语言快速理解
go
马剑威(威哥爱编程)4 小时前
【AI全栈后端12-09】Spring Boot 用流式输出做打字机对话:点下去不再干等
java·人工智能·spring boot·后端