GoLang读取文件需要用到os类去打开文件,然后再用其他方式分析文件里的内容。打开文件比较简单,使用os.Open就可以了,记住用defer关闭就行。但是读取文件内容就头疼了,以文本文件为例子,就有各种方式
读取到byte数组
首先试试用byte数组吧。
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 用go打开一个文件
file, err := os.Open("content.txt")
if err != nil {
panic(err)
}
defer file.Close()
// 读取文件内容
content := make([]byte, 1024)
_, err = file.Read(content)
if err != nil {
panic(err)
}
fmt.Println(string(content))
}
使用这种方式,输出文件会出现问题。比如我的输出结果就有很多不正常的字符:
这是由于我的数组长度是1024,但是文件内容不足。所以数组后面全是0,转为字符串就出问题了。
获取文件大小
但是os.Open返回的文件是不能获取文件大小的,但是有办法,os.Stat可以获取文件大小,所以接下来我把代码中写死的1024改成文件大小,就可以了:
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 用go打开一个文件
file, err := os.Open("content.txt")
if err != nil {
panic(err)
}
defer file.Close()
stat, err := os.Stat("content.txt")
if err != nil {
panic(err)
}
// 读取文件内容
content := make([]byte, stat.Size())
_, err = file.Read(content)
if err != nil {
panic(err)
}
fmt.Println(string(content))
}
这样打印出来,就没有非法字符了。如图:
使用ioutil
但是这样还是麻烦,幸好golang提供了ioutil可以直接读取文件内容,直接使用ReadAll函数就可以了。代码更简单了:
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 用go打开一个文件
file, err := os.Open("content.txt")
if err != nil {
panic(err)
}
defer file.Close()
// 读取文件内容
content, err := ioutil.ReadAll(file)
if err != nil {
panic(err)
}
fmt.Println(string(content))
}
执行结果是一样的。