使用Go语言逐行读取文件,最简单的方法是使用 bufio.Scanner。
常规做法
简单示例:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("/path/to/file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
// 注意,如果读取的行长度超过64k,则会报错
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
字符串长度超出64K
Scan在行超过 65536 个字符时出错。如果知道行长度大于 64K,可以使用 Buffer() 方法来增加Scan的容量。
添加Buffer的示例:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("/path/to/file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
const maxCapacity = longLineLen // 需要的容量
buf := make([]byte, maxCapacity)
scanner.Buffer(buf, maxCapacity)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
使用Buffer核心代码是:
buf := make([]byte, maxCapacity)
scanner.Buffer(buf, maxCapacity)