Go 语言文件操作:写入文件 1 个改进

写文件

明确,对文件的操作,都应该先获取到一个文件操作句柄,即使go的官方包可能提供让我们一次性写入的方法,但是其内部实现也都是有一个操作句柄,想要获取到一个文件的操作句柄(普通文件),可以使用os.Open/os.Create/os.OpenFile来实现,在以下的一些例子中,笔者采用os.Create来获取操作句柄

1 使用os包

在使用os.Create获取到文件操作句柄后,其本身就有绑定一些写文件的方法

示例代码

func main() {
    //在当前路径下,创建test.txt文件,若当前路径存在test.txt,则清空其内容
    fileHandler, err := os.Create("./test.txt")
    if nil != err {
        panic(err)
    }
    defer fileHandler.Close()

    //使用Write
    _, err = fileHandler.Write([]byte("hello world\n"))
    checkErr(err)
    //使用WriteString
    _, err = fileHandler.WriteString("this is to test file writing\n")
    checkErr(err)
    //还有一些其他的写操作函数,可以查看官方文档

    fmt.Println("执行成功,请检查文件内容是否写入正确")
}

func checkErr(err error) {
    if nil != err {
        panic(err)
    }
}

运行结果

PS D:\GoPractice> go run .\filewrite\main.go
执行成功,请检查文件内容是否写入正确

#以下是test.txt文件的内容
hello world
this is to test file writing

2 使用os加fmt的方式,实现格式化写入文件

先用os.Create获取到操作句柄,然后用fmt.Fprintln格式化写入文件

示例代码

func main() {
    fmtWriteFileDemo("./filewrite/test.txt")
    fmt.Println("请检查文件内容是否写入正确")
}

func checkErr(err error) {
    if nil != err {
        panic(err)
    }
}

func fmtWriteFileDemo(p string) {
    //在当前路径下,创建test.txt文件,若当前路径存在test.txt,则清空其内容
    fileHandler, err := os.Create(p)
    checkErr(err)
    defer fileHandler.Close()

    fmt.Fprintln(fileHandler, "hello world")
    fmt.Fprintln(fileHandler, 1, 2, 3, 4, 5, 6)
    fmt.Fprintln(fileHandler, "测试格式化写入文件")
}

运行结果

PS D:\GoPractice> go run .\filewrite\main.go
请检查文件内容是否写入正确
#以下是test.txt的内容
hello world
1 2 3 4 5 6
测试格式化写入文件

3 使用bufio包

使用bufio包创建一个WriterBuffer来做写文件操作,这里有一点需要注意的是,在执行完Write操作之后,应该要调用Flush,将内容全部打到文件中去

示例代码

func main() {
    // fmtWriteFileDemo("./filewrite/test.txt")
    bufioWriteFileDemo("./filewrite/test.txt")
    fmt.Println("请检查文件内容是否写入正确")
}

func checkErr(err error) {
    if nil != err {
        panic(err)
    }
}

func bufioWriteFileDemo(p string) {
    //在当前路径下,创建test.txt文件,若当前路径存在test.txt,则清空其内容
    fileHandler, err := os.Create(p)
    checkErr(err)
    defer fileHandler.Close()

    fileWriter := bufio.NewWriter(fileHandler)

    fileWriter.WriteString("hello world\n")
    fileWriter.WriteString("这是使用bufio来测试写入文件\n")
    fileWriter.Write([]byte("the end....\n"))

    //没有这一句,则文件不会有内容
    err = fileWriter.Flush()
    checkErr(err)
}

运行结果

PS D:\GoPractice> go run .\filewrite\main.go
请检查文件内容是否写入正确
#以下是文件内容
hello world
这是使用bufio来测试写入文件
the end....

4 使用ioutil包

和读文件类似,如果想要写入的数据大小没那么大,我们可以采用ioutil.WriteFile的操作来写文件

示例代码

func main() {
    fileContent := `
        hello world!
        这是使用ioutil包来写入文件的操作
        the end...
    `
    checkErr(ioutil.WriteFile("./filewrite/test.txt", []byte(fileContent), os.ModePerm))
    fmt.Println("请检查文件内容是否写入正确")
}

func checkErr(err error) {
    if nil != err {
        panic(err)
    }
}

运行结果

PS D:\GoPractice> go run .\filewrite\main.go
请检查文件内容是否写入正确
# 以下是文件内容

        hello world!
        这是使用ioutil包来写入文件的操作
        the end...

结尾

可能还有一些可以执行写文件操作的一些方式,笔者最常用的是os包和bufio包,ioutil有时也会用,有兴趣的小伙伴可以继续补充

参考:studygolang.com/pkgdoc

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

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