Skip to content

Latest commit

 

History

History
183 lines (142 loc) · 3.25 KB

writefile.md

File metadata and controls

183 lines (142 loc) · 3.25 KB

写文件

上一节课介绍了 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
}