总结

ioutil.ReadFile > ioutil.ReadAll > bufio.NewReader > *File.Read > bufio.NewScanner
4.99M txt文档性能测试如下:
image.png
image.png
image.png
image.png
image.png

ioutil.ReadFile

一次性读取filename文件中的所有数据。性能 高!
因为是一次性返回文件中的所有数据,所以不会返回EOF异常信息。

func ReadFile(filename string) ([]byte, error)

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. )
  6. func main() {
  7. f, err := ioutil.ReadFile("C:/Users/Administrator/Downloads/test.txt")
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }
  12. fmt.Println(f)
  13. }

ioutil.ReadAll

一次性读取io.Reader中的所有数据。性能 高!
因为是一次性返回文件中的所有数据,所以不会返回EOF异常信息。

func ReadAll(r io.Reader) ([]byte, error)

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. )
  7. func main() {
  8. f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
  9. if err != nil {
  10. fmt.Println(err)
  11. return
  12. }
  13. defer f.Close()
  14. buf, err := ioutil.ReadAll(f)
  15. if err != nil {
  16. fmt.Println(err)
  17. return
  18. }
  19. fmt.Println(buf)
  20. }

bufio.NewReader

按字节读取数据,单读取到文件末尾时,返回0, io.EOF。

func NewReader(rd io.Reader) *Reader

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. func main() {
  9. f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
  10. if err != nil {
  11. fmt.Println(err)
  12. return
  13. }
  14. defer f.Close()
  15. reader := bufio.NewReader(f)
  16. text, buf := make([]byte, 1024), make([]byte, 1024)
  17. for {
  18. n, err := reader.Read(buf)
  19. if err != nil {
  20. // 文件读取完毕
  21. if err == io.EOF {
  22. break
  23. }
  24. fmt.Println(err)
  25. return
  26. }
  27. text = append(text, buf[:n]...)
  28. }
  29. fmt.Println(text)
  30. }

*File.Reader

按字节读取数据,单读取到文件末尾时,返回0, io.EOF。

func (f *File) Read(b []byte) (n int, err error)

  1. package main
  2. import (
  3. "GoClass02/go02_wangxingchen/homework03"
  4. "GoClass02/go02_wangxingchen/homework03/dict"
  5. "bufio"
  6. "fmt"
  7. "io"
  8. "os"
  9. )
  10. func main() {
  11. f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
  12. if err != nil {
  13. fmt.Println(err)
  14. return
  15. }
  16. defer f.Close()
  17. text, buf := make([]byte, 1024), make([]byte, 1024)
  18. for {
  19. // n: 读取到的字符长度
  20. n, err := f.Read(buf)
  21. if err != nil {
  22. // 文件读取完毕
  23. if err == io.EOF {
  24. break
  25. }
  26. fmt.Println(err)
  27. return
  28. }
  29. text = append(text, buf[:n]...)
  30. }
  31. fmt.Println(text)
  32. }

bufio.Scanner

整行读取文件。性能 较低!

func NewScanner(r io.Reader) *Scanner

  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "fmt"
  6. )
  7. func main() {
  8. f, err := os.Open("C:/Users/Administrator/Downloads/test.txt")
  9. if err != nil {
  10. fmt.Println(err)
  11. return
  12. }
  13. defer f.Close()
  14. scanner := bufio.NewScanner(f)
  15. var text bytes.Buffer
  16. for scanner.Scan() {
  17. // 整行读取
  18. text.WriteString(scanner.Text())
  19. }
  20. fmt.Println(text)
  21. }