据需求选择:如果需要一次性读取,用ioutil.ReadFile和ioutil.ReadAll方便;如果需要分块或分行,用bufio的Read、ReadString或者ReadLine更加方便;如果是大文件读写的话,用bufio。

一、一次性读取整个文件.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)
}

四、利用多线程读取大文件

五、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)