总结
ioutil.ReadFile > ioutil.ReadAll > bufio.NewReader > *File.Read > bufio.NewScanner
4.99M txt文档性能测试如下:
ioutil.ReadFile
一次性读取filename文件中的所有数据。性能 高!
因为是一次性返回文件中的所有数据,所以不会返回EOF异常信息。
func ReadFile(filename string) ([]byte, error)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
f, err := ioutil.ReadFile("C:/Users/Administrator/Downloads/test.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(f)
}
ioutil.ReadAll
一次性读取io.Reader中的所有数据。性能 高!
因为是一次性返回文件中的所有数据,所以不会返回EOF异常信息。
func ReadAll(r io.Reader) ([]byte, error)
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
buf, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(buf)
}
bufio.NewReader
按字节读取数据,单读取到文件末尾时,返回0, io.EOF。
func NewReader(rd io.Reader) *Reader
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
reader := bufio.NewReader(f)
text, buf := make([]byte, 1024), make([]byte, 1024)
for {
n, err := reader.Read(buf)
if err != nil {
// 文件读取完毕
if err == io.EOF {
break
}
fmt.Println(err)
return
}
text = append(text, buf[:n]...)
}
fmt.Println(text)
}
*File.Reader
按字节读取数据,单读取到文件末尾时,返回0, io.EOF。
func (f *File) Read(b []byte) (n int, err error)
package main
import (
"GoClass02/go02_wangxingchen/homework03"
"GoClass02/go02_wangxingchen/homework03/dict"
"bufio"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
text, buf := make([]byte, 1024), make([]byte, 1024)
for {
// n: 读取到的字符长度
n, err := f.Read(buf)
if err != nil {
// 文件读取完毕
if err == io.EOF {
break
}
fmt.Println(err)
return
}
text = append(text, buf[:n]...)
}
fmt.Println(text)
}
bufio.Scanner
整行读取文件。性能 较低!
func NewScanner(r io.Reader) *Scanner
package main
import (
"bufio"
"bytes"
"fmt"
)
func main() {
f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
scanner := bufio.NewScanner(f)
var text bytes.Buffer
for scanner.Scan() {
// 整行读取
text.WriteString(scanner.Text())
}
fmt.Println(text)
}