2026-10-30 13:11:09
在Go语言中,可通过bufio.Scanner和bufio.Writer高效实现文本文件与字符串切片的读写操作。以下为具体实现方法及关键点解析:
一、读取文本文件到字符串切片使用bufio.Scanner按行扫描文件内容,存储到字符串切片中,适合处理大文件(逐行加载避免内存溢出)。
核心代码实现:
func readLines(path string) ([]string, error) { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() // 确保文件关闭 var lines []string scanner := bufio.NewScanner(file) // 创建Scanner实例 for scanner.Scan() { lines = append(lines, scanner.Text()) // 逐行添加到切片 } return lines, scanner.Err() // 返回结果及可能的扫描错误}关键点解析:
使用bufio.Writer缓冲写入,减少底层I/O操作次数,提升性能(尤其适合频繁写入小数据块)。
核心代码实现:
func writeLines(lines []string, path string) error { file, err := os.Create(path) if err != nil { return err } defer file.Close() w := bufio.NewWriter(file) // 创建缓冲写入器 for _, line := range lines { fmt.Fprintln(w, line) // 自动添加换行符 } return w.Flush() // 强制刷新缓冲区到文件}关键点解析:
示例程序流程:
代码实现:
func main() { // 读取文件 lines, err := readLines("foo.in.txt") if err != nil { log.Fatalf("readLines: %s", err) } fmt.Println("文件内容:") for i, line := range lines { fmt.Printf("%d: %sn", i, line) } // 写入文件 if err := writeLines(lines, "foo.out.txt"); err != nil { log.Fatalf("writeLines: %s", err) } fmt.Println("n内容已成功写入 foo.out.txt")}运行前准备:
调整bufio.Scanner缓冲区大小(通过scanner.Buffer())。
批量写入时,可手动控制Flush()调用频率(如每N行刷新一次)。
Go语言的bufio包通过缓冲机制显著提升了文件I/O效率,结合Scanner和Writer可轻松实现文本文件与字符串切片的高效转换。掌握此类基础操作是开发高性能文件处理应用的关键,尤其适用于日志分析、数据清洗等场景。