最近有遇到需要用go读取大文件的情况,顺路研究了一下go几种读取文件方式的效率。
go几种常见的文件io方式
-
使用os包内的open和read。
fi, err := os.Open(path) // 打开文件 buf := make([]byte, 1024) n, err := fi.Read(buf) // 读取内容
-
使用buffered io
fi, err := os.Open(path) r := bufio.NewReader(fi) buf := make([]byte, 1024) n, err := r.Read(buf)
-
使用ioutil包内的方法
fi, err := os.Open(path) fd, err := ioutil.ReadAll(fi)
现象(效率对比)
准备了待读取文件信息如下:
total 720912
-rw-r--r-- 1 stephen staff 2.3K Sep 15 11:59 io_demo.go
-rw-r--r-- 1 stephen staff 336M Sep 15 11:59 test.txt
同时io_demo.go文件中的代码如下:
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
"time"
)
func readRaw(path string) string {
start := time.Now()
fi, err := os.Open(path)
if err != nil {
panic(err)
}
defer fi.Close()
defer func() {
fi.Close()
fmt.