写文件

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

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

创建文件

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

简单示例:

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. )
  7. func checkErr(err error) {
  8. if err != nil {
  9. panic(err)
  10. }
  11. }
  12. func main() {
  13. path := "test.txt"
  14. newFile, err := os.Create(path)
  15. checkErr(err)
  16. defer newFile.Close()
  17. fileInfo, err := os.Stat(path)
  18. if err != nil {
  19. if os.IsNotExist(err) {
  20. fmt.Println("file doesn't exist!")
  21. return
  22. }
  23. }
  24. fmt.Println("file does exist, file name : ", fileInfo.Name())
  25. }

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

示例如下:

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. )
  6. func checkErr(err error) {
  7. if err != nil {
  8. panic(err)
  9. }
  10. }
  11. func readFile(path string) {
  12. data, err := ioutil.ReadFile(path)
  13. checkErr(err)
  14. fmt.Println("file content: ", string(data))
  15. }
  16. func main() {
  17. path := "test.txt"
  18. str := "hello"
  19. err := ioutil.WriteFile(path, []byte(str), 0644)
  20. checkErr(err)
  21. readFile(path)
  22. }

在文件指定位置写入内容

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

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. )
  7. func checkErr(err error) {
  8. if err != nil {
  9. panic(err)
  10. }
  11. }
  12. func readFile(path string) {
  13. data, err := ioutil.ReadFile(path)
  14. checkErr(err)
  15. fmt.Println("file content: ", string(data))
  16. }
  17. func main() {
  18. path := "test.txt"
  19. str := "hello"
  20. newStr := "world"
  21. newFile, err := os.Create(path)
  22. checkErr(err)
  23. n1, err := newFile.WriteString(str)
  24. checkErr(err)
  25. fmt.Println("n1: ", n1)
  26. readFile(path)
  27. n2, err := newFile.WriteAt([]byte(newStr), 6)
  28. checkErr(err)
  29. fmt.Println("n2: ", n2)
  30. readFile(path) // the file content should be "helloworld"
  31. n3, err := newFile.WriteAt([]byte(newStr), 0)
  32. checkErr(err)
  33. fmt.Println("n3: ", n3)
  34. readFile(path) // the file content should be "worldworld"
  35. }

通过 Buffered Writer 写文件

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

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. )
  8. func checkErr(err error) {
  9. if err != nil {
  10. panic(err)
  11. }
  12. }
  13. func readFile(path string) {
  14. data, err := ioutil.ReadFile(path)
  15. checkErr(err)
  16. fmt.Println("file content: ", string(data))
  17. }
  18. func main() {
  19. path := "test.txt"
  20. str := "hello"
  21. newFile, err := os.Create(path)
  22. checkErr(err)
  23. defer newFile.Close()
  24. bufferWriter := bufio.NewWriter(newFile)
  25. for _, v := range str {
  26. written, err := bufferWriter.WriteString(string(v))
  27. checkErr(err)
  28. fmt.Println("written: ", written)
  29. }
  30. readFile(path) // NOTE: you'll read nothing here because without Flush() operation
  31. // let's check how much is stored in buffer
  32. unflushSize := bufferWriter.Buffered()
  33. fmt.Println("unflushSize: ", unflushSize)
  34. // write memory buffer to disk
  35. bufferWriter.Flush()
  36. readFile(path) // now you can get content from file
  37. }