在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。
1、打开文件
使用os.Open
打开文件
package main
import (
"log"
"os"
)
func main() {
file, err := os.Open("xxx.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
}
2、获取文件信息
使用file.Stat
获取文件的基本信息,包括文件大小
package main
import (
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("xxx.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
fileSize := fileInfo.Size()
fmt.Println(fileSize)
}
3、设置缓冲区大小
为了提高读取效率,使用合适大小的缓冲区
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
//1、打开文件
file, err := os.Open("xxx.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
//2、获取文件信息
fileInfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
fileSize := fileInfo.Size()
fmt.Println(fileSize)
//3、设置缓冲区大小
bufferSize := 8192 // 8KB 缓冲区大小
buffer := make([]byte, bufferSize)
}
4、循环读取文件内容
使用file.Read
循环读取文件内容
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
//1、打开文件
file, err := os.Open("xxx.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
//2、获取文件信息
fileInfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
fileSize := fileInfo.Size()
fmt.Println(fileSize)
//3、设置缓冲区大小
bufferSize := 8192 // 8KB 缓冲区大小
buffer := make([]byte, bufferSize)
//4、循环读取文件内容
for {
bytesRead, err := file.Read(buffer)
if err == io.EOF {
// 文件读取完毕
break
}
if err != nil {
log.Fatal(err)
}
// 处理读取的数据,例如输出到控制台
fmt.Print(string(buffer[:bytesRead]))
}
}
5、 关闭文件
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
//1、打开文件
file, err := os.Open("xxx.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()//关闭
//2、获取文件信息
fileInfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
fileSize := fileInfo.Size()
fmt.Println(fileSize)
//3、设置缓冲区大小
bufferSize := 8192 // 8KB 缓冲区大小
buffer := make([]byte, bufferSize)
//4、循环读取文件内容
for {
bytesRead, err := file.Read(buffer)
if err == io.EOF {
// 文件读取完毕
break
}
if err != nil {
log.Fatal(err)
}
// 处理读取的数据,例如输出到控制台
fmt.Print(string(buffer[:bytesRead]))
}
}
6、案例
package main
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
func main() {
file, err := os.Open("large_file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
const maxScanTokenSize = 64 * 1024 * 1024 // 64MB
buf := make([]byte, maxScanTokenSize)
scanner := bufio.NewScanner(file)
scanner.Buffer(buf, maxScanTokenSize)
for scanner.Scan() {
line := scanner.Text()
// 处理每一行的逻辑
fmt.Println(line) //打印每一行
fields := strings.Split(line, ",") // 假设使用逗号分隔
// 处理fields中的每个字段
for _, field := range fields {
fmt.Println(field)
// 可以添加更多处理逻辑
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}