通过前一篇文章学习了如何读取文件内容,接下来学习一下文件的写入。
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.");
}
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("这是新的文本内容");
}
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 方法时,缓冲区可能还存在没有刷新到磁盘中的内容,所用我们要手动刷新。在实际编程中不管缓冲区的大小,以及已经写入内容多少。我们在最后都手动刷新一下,防止内容丢失。