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



ioutil.ReadFile
一次性读取filename文件中的所有数据。性能 高!
因为是一次性返回文件中的所有数据,所以不会返回EOF异常信息。
func ReadFile(filename string) ([]byte, error)
package mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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.Bufferfor scanner.Scan() {// 整行读取text.WriteString(scanner.Text())}fmt.Println(text)}
