go 语言文件操作:读取文件 | go 技术论坛-金年会app官方网
使用go读取文件的常见办法
在学习c语言的时候,对文件的读写操作,都应该获取到相应的文件操作句柄;但是在go里面,官方提供的标准包可能帮我们屏蔽了一些细节,让我们能一次性将文件内容读取出来;具体使用哪种,笔者认为这应该由我们的业务场景来决定;但我们要清楚有这些个办法能做文件的读取操作。
用来演示的文件test.txt
hello world!
this is to test file reading
...
1 使用os包
使用流程先打开文件,获取到文件操作句柄,打开文件操作可以用os.open, os.openfile,这里的例子笔者用os.open,其实际调用的也是os.openfile
示例代码
func main() {
filecontent, err := filereaddemo1("./test.txt")
if nil != err {
fmt.println(err)
return
}
fmt.println(string(filecontent))
}
func filereaddemo1(p string) ([]byte, error) {
//打开文件p,获取p的文件操作句柄,文件不存在则panic
filehandler, err := os.open(p)
if nil != err {
panic(err)
}
//关闭文件
defer filehandler.close()
//分配1k的buffer,具体应该分配多少,可以具体考量
buffer := make([]byte, 1024)
//要返回的数据
ret := []byte{}
//循环读取
for {
readlength, err := filehandler.read(buffer)
if err != nil {
//文件结尾
if err == io.eof {
ret = append(ret, buffer[:readlength]...)
return ret, nil
}
return nil, err
}
ret = append(ret, buffer[:readlength]...)
}
}
运行结果
ps d:\gopractice\fileopt> go run .\main.go
hello world!
this is to test file reading
...
2 结合os和bufio,实现选择性读取
打开文件的操作还是一样的,但是我们用bufio来实例化一个readbuffer,这样我们就可以使用readbuffer所绑定的方法,达到不同方式读取文件的操作
示例代码
func main() {
filereaddemo2("./test.txt")
}
func filereaddemo2(p string) {
filehandler, err := os.open(p)
checkerr(err)
filereader := bufio.newreader(filehandler)
//readline
oneline, _, err := filereader.readline()
checkerr(err)
fmt.println("这是文件", p, "的一行:", string(oneline))
//readbyte
onebyte, err := filereader.readbyte()
checkerr(err)
fmt.println("这是继", string(oneline), "之后", "文件", p, "的一个byte:", onebyte)
//readbytes
readbytes, err := filereader.readbytes('\n')
checkerr(err)
fmt.println(string(readbytes))
}
//由于出现许多需要判断error的地方,且都是直接panic,就写了一个checkerr
func checkerr(err error) {
if nil != err {
panic(err)
}
}
运行结果
ps d:\gopractice\fileopt> go run .\main.go
这是文件 ./test.txt 的一行: hello world!
这是继 hello world! 之后 文件 ./test.txt 的一个byte: 116
his is to test file reading
3 使用ioutil包
当文件比较小的时候,且我们就是知道我们要读取文件的全部数据后再进行处理,我们可以选择使用ioutil.readfile来读取文件,当然,我们可以再使用os.open获取到操作句柄的时候,使用ioutil.readall来读取,这里我们示例用ioutil.readfile
示例代码
func main() {
bs, err := ioutil.readfile("./test.txt")
checkerr(err)
fmt.println(string(bs), err)
}
func checkerr(err error) {
if nil != err {
panic(err)
}
}
4 使用io包
使用io.readfull,这个笔者也不经常用,这里给出一个demo了解一下
示例代码
func main() {
fi, err := os.stat("./test.txt")
checkerr(err)
buffer := make([]byte, fi.size())
// buffer := []byte{}
filehandler, err := os.open("./test.txt")
checkerr(err)
//如果len(buffer)>文件大小,则会报错
n, err := io.readfull(filehandler, buffer)
checkerr(err)
fmt.println(string(buffer[:n]))
}
运行结果
ps d:\gopractice\fileopt> go run .\main.go
hello world!
this is to test file reading
...
参考: