go提供读文件的方法有:ioutil.ReadAll,ioutil.ReadFile,file.Read,bufio.NewReader等方法,我们可以一次性读取,按buf读取,按行读取等。下面我们先介绍一下他们的使用。
1:golang一次性读所有的文件内容
ioutil.ReadAll实例
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
//读文件
file, err := os.Open("E://stat.log.2021-03-10-17")
if err != nil {
fmt.Println("读文件失败", err)
return
}
defer file.Close()
content, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("读内容失败", err)
return
}
fmt.Println(string(content))
}
ioutil.ReadFile实例
package main
import (
"fmt"
"io/ioutil"
)
func main() {
//读文件
filePath := "E://stat.log.2021-03-10-17"
content, err := ioutil.ReadFile(filePath)
if err != nil {
fmt.Println("读内容失败", err)
return
}
fmt.Println(string(content))
}
2:golang读文件到buf中
file.Read读取方式
package main
import (
"fmt"
"io"
"os"
)
func main() {
//读文件
filePath := "E://stat.log.2021-03-10-17"
file, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
chunk := []byte{}
buf := make([]byte, 100)
for {
//file读取到buf中
n, err := file.Read(buf)
//当n为0 并且到eof说明文件读完了,则退出
if n == 0 {
if err == io.EOF {
break
}
if err != nil {
break
}
fmt.Println("err", err)
return
}
fmt.Println("buf:", string(buf[:n]))
//追加到chunk中去
chunk = append(chunk, buf[:n]...)
}
fmt.Println("end:", len(string(chunk)))
}
用bufio读文件到buf中
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//读文件,先从文件读取到file, 在从file读取到Reader中,从Reader读取到buf, buf最终追加到[]byte
filePath := "E://stat.log.2021-03-10-17"
file, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
chunk := []byte{}
buf := make([]byte, 100)
//
r := bufio.NewReader(file)
for {
//file读取到buf中
n, err := r.Read(buf)
//当n为0 并且到eof说明文件读完了,则退出
if n == 0 {
if err == io.EOF {
break
}
if err != nil {
break
}
fmt.Println("err", err)
return
}
fmt.Println("buf:", string(buf[:n]))
//追加到chunk中去
chunk = append(chunk, buf[:n]...)
}
fmt.Println("end:", len(string(chunk)))
}
3:按行读取数据
用bufio按行读数据
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//按行读文件,先从文件读取到file, 在从file读取到Reader中,从Reader读取到buf, buf最终追加到[]byte
filePath := "E://stat.log.2021-03-10-17"
file, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
//
r := bufio.NewReader(file)
for {
//读一行数据
line, err := r.ReadString('\n')
//当n为0 并且到eof说明文件读完了,则退出
if err == io.EOF {
break
}
fmt.Println("line:", line)
}
}