Go语言_文件---文件操作

📅 2026/7/19 17:35:09
Go语言_文件---文件操作
一、文件基础分类1. 设备文件标准输入 / 输出操作系统自带的默认打开设备文件程序启动即可直接使用标准输出设备 stdout屏幕fmt.Println()底层封装os.Stdout向屏幕输出内容原生 APIos.Stdout.WriteString(内容\n)可手动关闭os.Stdout.Close()关闭后无法再打印输出标准输入设备 stdin键盘fmt.Scan(变量)从键盘读取用户输入底层对应os.Stdin2. 磁盘文件存储在硬盘断电后数据持久保存分为两类文本文件记事本打开不乱码由字符组成.txt、.md、.json二进制文件记事本打开乱码存储原始二进制数据图片、视频、exe、压缩包补充文件存在的意义内存是临时存储程序退出 / 设备断电后数据直接丢失磁盘文件可永久保存数据。二、os 包核心文件操作 API1. 创建文件两种方式go// 方式1常用根据文件名创建文件权限0666文件默认可读可写 func Create(name string) (*os.File, error) // 方式2通过文件描述符创建文件底层底层接口业务开发极少使用 func NewFile(fd uintptr, name string) *os.File2. 打开文件两种方式go// 方式1只读模式打开文件底层封装OpenFile func Open(name string) (*os.File, error) // 方式2自定义打开模式、权限功能最全读写/追加/创建都靠它 func OpenFile(name string, flag int, perm uint32) (*os.File, error)flag打开模式标识只读、只写、读写、追加等perm文件权限Linux 权限数字如 06663. 文件基础操作能力文件 API 支持四大核心操作创建、打开、读、写、删除三、标准设备文件Stdin/Stdout代码示例gopackage main import ( fmt os ) func main() { // 1. 标准输出打印封装os.Stdout fmt.Println(are u ok?) // 原生Stdout写入 os.Stdout.WriteString(are u ok?\n) // 关闭标准输出关闭后无法打印 // os.Stdout.Close() // 2. 标准输入键盘读取 var a int fmt.Println(请输入a:) fmt.Scan(a) fmt.Println(a , a) }四、磁盘文件写入操作 os.Create WriteString知识点os.Create(path)文件不存在则新建存在则清空原有内容文件打开后必须关闭推荐defer f.Close()延迟关闭避免文件句柄泄漏f.WriteString(string)写入字符串返回写入字节长度与错误gopackage main import ( fmt os ) // 向文件循环写入内容 func WriteFile(path string) { // 创建/清空文件 f, err : os.Create(path) if err ! nil { fmt.Println(创建文件失败 err , err) return } // 函数结束自动关闭文件 defer f.Close() for i : 0; i 10; i { buf : fmt.Sprintf(i %d\n, i) n, err : f.WriteString(buf) if err ! nil { fmt.Println(写入失败 err , err) } fmt.Printf(本次写入字节数%d\n, n) } } func main() { path : ./demo.txt WriteFile(path) }五、磁盘文件读取操作 os.Open Read核心要点os.Open()只读打开文件不能写入Read([]byte)将文件数据读取到字节切片缓冲区返回值n实际读到的字节数量打印时截取buf[:n]避免多余空字节io.EOF文件读取完毕标记读到 EOF 代表文件读完gopackage main import ( fmt io os ) func ReadFile(path string) { // 只读打开文件 f, err : os.Open(path) if err ! nil { fmt.Println(打开文件失败 err , err) return } defer f.Close() // 开辟2KB缓冲区 buf : make([]byte, 1024*2) n, err1 : f.Read(buf) // 排除正常结束的EOF错误 if err1 ! nil err1 ! io.EOF { fmt.Println(读取文件失败 err1 , err1) return } // 只打印实际读到的数据 fmt.Println(文件内容, string(buf[:n])) } func main() { ReadFile(./demo.txt) }六、bufio 缓冲区按行读取文件大文件推荐作用直接 Read 一次性读取全部内容大文件占用内存高bufio提供缓冲区支持按行读取节省内存。gopackage main import ( bufio fmt io os ) func ReadFileByLine(path string) { f, err : os.Open(path) if err ! nil { fmt.Println(打开失败 err , err) return } defer f.Close() // 创建带缓冲读取器 r : bufio.NewReader(f) for { // 按换行符分割读取一行包含\n lineBuf, err : r.ReadString(\n) if err ! nil { // 读到文件末尾跳出循环 if err io.EOF { break } fmt.Println(读取行失败 err , err) return } fmt.Print(lineBuf) } }七、实战案例文件拷贝工具命令行传参功能说明通过os.Args获取命令行执行参数参数格式程序名 源文件路径 目标文件路径开辟 4KB 缓冲区循环读写适合任意大小文件自动校验参数数量、源文件与目标文件不能同名gopackage main import ( fmt io os ) func main() { // 获取命令行参数列表 args : os.Args // 参数必须是程序名 src dst 共3个 if len(args) ! 3 { fmt.Println(使用方式go run main.go 源文件路径 目标文件路径) return } srcFileName : args[1] dstFileName : args[2] if srcFileName dstFileName { fmt.Println(错误源文件和目标文件不能相同) return } // 打开源文件只读 sF, err : os.Open(srcFileName) if err ! nil { fmt.Println(打开源文件失败 err , err) return } // 创建目标文件清空原有内容 dF, err : os.Create(dstFileName) if err ! nil { fmt.Println(创建目标文件失败 err , err) return } // 延迟关闭两个文件 defer sF.Close() defer dF.Close() // 4KB缓冲区循环读写 buf : make([]byte, 4*1024) for { // 读源文件 n, err : sF.Read(buf) if err ! nil { if err io.EOF { // 文件读取完成退出循环 break } fmt.Println(读取源文件出错 err , err) return } // 读到多少写入多少到目标文件 _, err dF.Write(buf[:n]) if err ! nil { fmt.Println(写入目标文件出错 err , err) return } } fmt.Println(文件拷贝完成) }八、高频易错点汇总复习重点文件打开后必须关闭优先使用defer Close()防止句柄泄露os.Create()打开已有文件会清空内容只读读取用os.Open()Read(buf)返回 n 为实际读取字节输出必须截取buf[:n]否则会打印空占位字节文件读取报错要判断err ! io.EOF读到末尾属于正常情况不算错误大文件不要一次性全部读取使用bufio按行读取降低内存占用os.Args第一个参数是程序自身名称业务参数从下标 1、2 开始取标准输入输出设备无需手动 Open程序启动自动打开文本 / 二进制文件读写 API 无区分底层全部操作字节切片九、方案选型对比表格读取方式适用场景优缺点file.Read()一次性读小文件代码简单大文件占用内存高bufio.NewReader按行读日志、大文本文件内存占用低逐行处理推荐业务使用循环缓冲区读写拷贝案例图片、视频等二进制大文件稳定通用工业级文件复制方案十、整体知识总结文件分设备文件标准输入输出、磁盘文件文本 / 二进制磁盘文件持久化存储数据创建文件os.Create()只读打开os.Open()自定义模式打开os.OpenFile()写入WriteString()基础读取Read([]byte)按行读取bufio.Reader.ReadString()文件拷贝核心逻辑开辟固定大小缓冲区循环读源文件、写目标文件开发规范defer延迟关闭文件、处理io.EOF正常结束标记、校验文件操作错误