据需求选择:如果需要一次性读取,用ioutil.ReadFile和ioutil.ReadAll方便;如果需要分块或分行,用bufio的Read、ReadString或者ReadLine更加方便;如果是大文件读写的话,用bufio。
https://www.jb51.net/article/187533.htm
https://www.cnblogs.com/wangqianlove/p/12579994.html
https://www.jianshu.com/p/62ae46556206
一、一次性读取整个文件.ioutil
package main
import (
"io/ioutil"
"log"
"fmt"
)
func main() {
bytes, err := ioutil.ReadFile("filetoread.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println("Bytes read: ", len(bytes))
fmt.Println("String read: ", string(bytes))
}
func read3(filepath string) string {
file, err := os.Open(filepath)
if err != nil{
panic(err)
}
defer file.Close()
f, _ := ioutil.ReadAll(file)
txt := string(f)
return txt
}
二、使用bufio分块读取
// bufio
func read2(filepath string) string {
file, err := os.Open(filepath)
if err != nil{
panic(err)
}
defer file.Close()
chunks := make([]byte,1024,1024)
f := bufio.NewReader(file)
buf := make([]byte,1024)
for {
n, err := f.Read(buf)
if err != nil || 0 == n {
break
}
chunks = append(chunks, buf[:n]...)
}
return string(chunks)
}
三、使用 os.Open分块读取
func read1(filepath string) string {
f, err := os.Open(filepath)
if err != nil{
panic(err)
}
defer f.Close()
chunks := make([]byte,1024,1024)
buf := make([]byte,1024)
for {
n, err := f.Read(buf)
if err != nil || 0 == n {
break
}
chunks = append(chunks, buf[:n]...)
}
return string(chunks)
}
四、利用多线程读取大文件
https://blog.csdn.net/dfsgwe1231/article/details/105994233
https://www.jb51.net/article/202425.htm
五、golang实现http表单大文件流式上传服务端代码
golang的http标准库的上传文件是一次性将文件全部读到内存中,这样上传小文件还可以,但是大文件就无能为力了。
userData, err := forms.Parse(c.Request)
if err != nil {
log.Printf("parse错误:%v", err)
return
}
header := userData.GetFile("file")
fileReader, err := userData.GetFileReader("file")
if err != nil {
log.Printf("获取reader错误:%v", err)
return
}
file, _ := os.Create(header.Filename)
io.Copy(file, fileReader)