Golang文件读写基础与操作方法Golang文件读写核心依赖os包和io包(含bufio子包),通过合理选择操作模式、缓冲读写及错误处理机制,可高效完成文件操作。
一、文件读取操作
1. 基础读取方法- os.Open:以只读模式打开文件,返回*os.File对象。
- ioutil.ReadFile(Go 1.16后推荐用os.ReadFile):一次性读取整个文件到内存,仅适用于小文件。
2. 大文件高效读取bufio.Scanner:按行或自定义规则分块读取,避免内存溢出。
file, err := os.Open("large_file.txt")if err != nil { fmt.Println("Error opening file:", err) return}defer file.Close()scanner := bufio.NewScanner(file)for scanner.Scan() { line := scanner.Text() // 逐行读取 fmt.Println(line)}if err := scanner.Err(); err != nil { fmt.Println("Error reading file:", err)}自定义分割:通过scanner.Split(bufio.SplitFunc)实现按空格、逗号等分割。
bufio.Reader:提供更细粒度控制,如按字节、字符串读取。
reader := bufio.NewReader(file)data, err := reader.ReadString('n') // 读取到换行符if err != nil { fmt.Println("Error reading:", err)}
二、文件写入操作
1. 基础写入方法- os.WriteFile(Go 1.16后推荐):一次性写入整个字节切片到文件。
- os.OpenFile:支持指定模式(如追加、创建)和权限。
2. 缓冲写入优化- bufio.Writer:减少系统调用次数,提升频繁小数据写入的性能。file, err := os.OpenFile("output.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)if err != nil { fmt.Println("Error opening file:", err) return}defer file.Close()writer := bufio.NewWriter(file)defer writer.Flush() // 确保数据落盘_, err = writer.WriteString("Hello, world!n")if err != nil { fmt.Println("Error writing:", err)}
关键点:
必须调用Flush(),否则缓冲数据可能丢失。
权限0644表示所有者可读写,其他用户只读。
三、文件操作模式与权限
1. 打开模式(os.OpenFile参数)- os.O_RDONLY:只读。
- os.O_WRONLY:只写。
- os.O_RDWR:读写。
- os.O_APPEND:追加写入。
- os.O_CREATE:文件不存在时创建。
- os.O_TRUNC:清空文件(若存在)。
2. 文件权限- 第三个参数为Unix权限位(如0644),控制所有者、组和其他用户的读写权限。
四、错误处理机制
1. 常见错误类型- 文件不存在:os.IsNotExist(err)。
- 权限不足:os.IsPermission(err)。
- 其他错误:直接打印或处理。
2. 错误处理示例file, err := os.Open("nonexistent_file.txt")if err != nil { if os.IsNotExist(err) { fmt.Println("File does not exist.") } else if os.IsPermission(err) { fmt.Println("Permission denied.") } else { fmt.Println("Error opening file:", err) } return}defer file.Close()3. 资源释放- defer file.Close():确保文件句柄释放,即使发生错误。
五、完整操作流程
打开文件:
读取:os.Open或os.OpenFile(只读模式)。
写入:os.OpenFile(指定模式和权限)。
读写操作:
读取:bufio.Scanner或bufio.Reader。
写入:bufio.Writer(缓冲)或直接写入。
错误处理:
检查err并区分错误类型。
关闭文件:
使用defer确保关闭。
六、总结
- 高效读取:大文件用bufio.Scanner或Reader分块处理。
- 性能写入:频繁小数据写入时使用bufio.Writer并调用Flush()。
- 错误处理:利用os.IsNotExist等函数精准处理。
- 资源管理:始终通过defer关闭文件,避免泄漏。
掌握这些细节后,可灵活应对Golang中的各类文件操作场景。