Go 零基础编程入门教程

 主页   资讯   文章   代码   电子书 

写文件

上一节课介绍了 Go 读文件的常用操作,本章节将介绍 Go 写文件的相关操作,包括:

  • 创建文件
  • 在文件指定位置写入内容
  • 通过 Buffered Writter 写文件

创建文件

  • 使用 os.Create(name string) 方法创建文件
  • 使用 os.Stat(name string) 方法获取文件信息

简单示例:

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

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

func main() {
    path := "test.txt"

    newFile, err := os.Create(path)
    checkErr(err)
    defer newFile.Close()

    fileInfo, err := os.Stat(path)
    if err != nil {
        if os.IsNotExist(err) {
            fmt.Println("file doesn't exist!")
            return
        }
    }
    fmt.Println("file does exist, file name : ", fileInfo.Name())
}

除了上述方法外,还可以通过 ioutil.WriteFile 一步完成文件创建和写入操作。假如该文件之前已经存在,那么将会覆盖掉原来的内容,写入新的内容。

示例如下:

package main

import (
    "fmt"
    "io/ioutil"
)

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

func readFile(path string) {
    data, err := ioutil.ReadFile(path)
    checkErr(err)
    fmt.Println("file content: ", string(data))
}

func main() {
    path := "test.txt"
    str := "hello"

    err := ioutil.WriteFile(path, []byte(str), 0644)
    checkErr(err)
    readFile(path)
}

在文件指定位置写入内容

使用 writeAt 可以在文件指定位置写入内容

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

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

func readFile(path string) {
    data, err := ioutil.ReadFile(path)
    checkErr(err)
    fmt.Println("file content: ", string(data))
}

func main() {
    path := "test.txt"
    str := "hello"
    newStr := "world"

    newFile, err := os.Create(path)
    checkErr(err)

    n1, err := newFile.WriteString(str)
    checkErr(err)
    fmt.Println("n1: ", n1)
    readFile(path)

    n2, err := newFile.WriteAt([]byte(newStr), 6)
    checkErr(err)
    fmt.Println("n2: ", n2)
    readFile(path) // the file content should be "helloworld"

    n3, err := newFile.WriteAt([]byte(newStr), 0)
    checkErr(err)
    fmt.Println("n3: ", n3)
    readFile(path) // the file content should be "worldworld"
}

通过 Buffered Writer 写文件

使用 Buffered Writer 可以避免太多次的磁盘 IO 操作。写入的内容首先是存在内存中,当调用 Flush() 方法后才会写入磁盘。

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "os"
)

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

func readFile(path string) {
    data, err := ioutil.ReadFile(path)
    checkErr(err)
    fmt.Println("file content: ", string(data))
}

func main() {
    path := "test.txt"
    str := "hello"

    newFile, err := os.Create(path)
    checkErr(err)
    defer newFile.Close()

    bufferWriter := bufio.NewWriter(newFile)

    for _, v := range str {
        written, err := bufferWriter.WriteString(string(v))
        checkErr(err)
        fmt.Println("written: ", written)
    }

    readFile(path) // NOTE: you'll read nothing here because without Flush() operation

    // let's check how much is stored in buffer
    unflushSize := bufferWriter.Buffered()
    fmt.Println("unflushSize: ", unflushSize)

    // write memory buffer to disk
    bufferWriter.Flush()

    readFile(path) // now you can get content from file
}