Go的学习路程:文件(三)|Go 主题月

499 阅读2分钟

通过前一篇文章学习了如何读取文件内容,接下来学习一下文件的写入。

File 输出

Go 提供了 Create 和 OpenFile 方法来创建可以写入的文件。

  • func OpenFile(name string, flag int, perm FileMode) (*File, error)
  • func Create(name string) (*File, error)

Create 方法创建或截断一个文件。如果文件已经存在,则会清空文件内容,否则就会创建一个模式为 0666 的空白文件。并且文件的标识为 O_RDWR 即可读写。

package main

import "fmt"
import "os"

func main () {
    f, err := os.Create("D:\\tmp\\f1.txt")

    if err != nil {
        fmt.Printf("创建文件错误,%v", err)
        return
    }
    defer f.Close()

    f.WriteString("hello go language.");
}

gorunfile3.png

OpenFile 提供了更灵活的文件打开方式。通过 flag 及 perm 两个参数创建或打开不同权限和模式的文件。

package main

import "fmt"
import "os"

func main () {
    f, err := os.OpenFile("D:\\tmp\\f1.txt", os.O_RDWR | os.O_CREATE, 0775)

    if err != nil {
        fmt.Printf("创建文件错误,%v", err)
        return
    }
    defer f.Close()

    f.WriteString("这是新的文本内容");
}

gorunfile4.png

bufio.Writer 输出

上一篇文章提到过,bufio 提供了 Reader、Scanner 及 Writer 来提升文件读写效率。其中 Writer 就是用来提升写效率的。

Writer 内部包含一个 []byte 的缓冲,只有当这个缓冲慢的时候才真正写入文件。相对于其他操作,IO 操作是非常耗时的。Writer 内的这个缓冲大小默认为 4096,及当写入 4096 个 byte 时,才会真正写入文件。当然我们也可以手动的将缓冲区的内容刷新到磁盘当中。也可以通过相应的方法创建指定大小缓冲区的 Writer。

  • func NewWriter(w io.Writer) *Writer 创建一个默认大小缓冲区的 Writer
  • func NewWriterSize(w io.Writer, size int) *Writer 创建一个指定大小缓冲区的 Writer
  • func (b *Writer) Flush() error 手动将缓冲区的内容刷新到磁盘中
import "fmt"
import "os"
import "bufio"

func main () {
    f, err := os.OpenFile("D:\\tmp\\f1.txt", os.O_RDWR | os.O_CREATE, 0775)

    if err != nil {
        fmt.Printf("创建文件错误,%v", err)
        return
    }
    defer f.Close()

    writer := bufio.NewWriterSize(f, 16)
    for i := 0; i<10; i++ {
        writer.WriteString("这是新的文本内容\n")
    }

    writer.Flush() // 1
}

如上代码演示了如何使用 Writer 写入文件。代码 1 处手动刷新缓冲区是因为,我们定义的缓冲区大小为 16。当我们最后一次调用 WriterSting 方法时,缓冲区可能还存在没有刷新到磁盘中的内容,所用我们要手动刷新。在实际编程中不管缓冲区的大小,以及已经写入内容多少。我们在最后都手动刷新一下,防止内容丢失。