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
...

参考:

本文为 wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
网站地图