使用io/ioutil进行读写文件

ioutil提供了两个方法:

  1. func ReadFile(filename string) ([]byte, error)

Go 文件读写操作 - 图1

  1. func WriteFile(filename string, data []byte, perm os.FileMode) error

Go 文件读写操作 - 图2

读文件

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. )
  6. func main() {
  7. b, err := ioutil.ReadFile("e:/tt.txt")
  8. if err != nil {
  9. fmt.Println(err)
  10. }
  11. fmt.Println(b)
  12. str := string(b)
  13. fmt.Println(str)
  14. }

写文件

  1. package main
  2. import (
  3. "io/ioutil"
  4. )
  5. func check(e error) {
  6. if e != nil {
  7. panic(e)
  8. }
  9. }
  10. func main() {
  11. d1 := []byte("hello\ngo\n")
  12. err := ioutil.WriteFile("e:tt2.txt", d1, 0644)
  13. check(err)
  14. }

使用OS进行读写文件

os包提供了两个方法:
func Open

  1. func Open(name string) (*File, error)

Go 文件读写操作 - 图3

读文件

  1. fi, err := os.Open(path)
  2. if err != nil {
  3. panic(err)
  4. }
  5. defer fi.Close()

func OpenFile
需要提供文件路径、打开模式、文件权限

  1. func OpenFile(name string, flag int, perm FileMode) (*File, error)

Go 文件读写操作 - 图4

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. )
  6. func main() {
  7. f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755)
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. if err := f.Close(); err != nil {
  12. log.Fatal(err)
  13. }
  14. }

读方法

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. func check(e error) {
  9. if e != nil {
  10. panic(e)
  11. }
  12. }
  13. func main() {
  14. f, err := os.Open("/tmp/dat")
  15. check(err)
  16. b1 := make([]byte, 5)
  17. n1, err := f.Read(b1)
  18. check(err)
  19. fmt.Printf("%d bytes: %s\n", n1, string(b1))
  20. o2, err := f.Seek(6, 0)
  21. check(err)
  22. b2 := make([]byte, 2)
  23. n2, err := f.Read(b2)
  24. check(err)
  25. fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
  26. o3, err := f.Seek(6, 0)
  27. check(err)
  28. b3 := make([]byte, 2)
  29. n3, err := io.ReadAtLeast(f, b3, 2)
  30. check(err)
  31. fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
  32. _, err = f.Seek(0, 0)
  33. check(err)
  34. r4 := bufio.NewReader(f)
  35. b4, err := r4.Peek(5)
  36. check(err)
  37. fmt.Printf("5 bytes: %s\n", string(b4))
  38. f.Close()
  39. }

写方法

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. )
  8. func check(e error) {
  9. if e != nil {
  10. panic(e)
  11. }
  12. }
  13. func main() {
  14. f, err := os.Create("/tmp/dat2")
  15. check(err)
  16. defer f.Close()
  17. d2 := []byte{115, 111, 109, 101, 10}
  18. n2, err := f.Write(d2)
  19. check(err)
  20. fmt.Printf("wrote %d bytes\n", n2)
  21. n3, err := f.WriteString("writes\n")
  22. fmt.Printf("wrote %d bytes\n", n3)
  23. f.Sync()
  24. w := bufio.NewWriter(f)
  25. n4, err := w.WriteString("buffered\n")
  26. fmt.Printf("wrote %d bytes\n", n4)
  27. w.Flush()
  28. }

几种读取文件方法速度比较

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. "time"
  9. )
  10. func read0(path string) string {
  11. f, err := ioutil.ReadFile(path)
  12. if err != nil {
  13. fmt.Printf("%s\n", err)
  14. panic(err)
  15. }
  16. return string(f)
  17. }
  18. func read1(path string) string {
  19. fi, err := os.Open(path)
  20. if err != nil {
  21. panic(err)
  22. }
  23. defer fi.Close()
  24. chunks := make([]byte, 1024, 1024)
  25. buf := make([]byte, 1024)
  26. for {
  27. n, err := fi.Read(buf)
  28. if err != nil && err != io.EOF {
  29. panic(err)
  30. }
  31. if 0 == n {
  32. break
  33. }
  34. chunks = append(chunks, buf[:n]...)
  35. }
  36. return string(chunks)
  37. }
  38. func read2(path string) string {
  39. fi, err := os.Open(path)
  40. if err != nil {
  41. panic(err)
  42. }
  43. defer fi.Close()
  44. r := bufio.NewReader(fi)
  45. chunks := make([]byte, 1024, 1024)
  46. buf := make([]byte, 1024)
  47. for {
  48. n, err := r.Read(buf)
  49. if err != nil && err != io.EOF {
  50. panic(err)
  51. }
  52. if 0 == n {
  53. break
  54. }
  55. chunks = append(chunks, buf[:n]...)
  56. }
  57. return string(chunks)
  58. }
  59. func read3(path string) string {
  60. fi, err := os.Open(path)
  61. if err != nil {
  62. panic(err)
  63. }
  64. defer fi.Close()
  65. fd, err := ioutil.ReadAll(fi)
  66. return string(fd)
  67. }
  68. func main() {
  69. file := "test.log" //file_name
  70. start := time.Now()
  71. read0(file)
  72. t0 := time.Now()
  73. fmt.Printf("Cost time %v\n", t0.Sub(start))
  74. read1(file)
  75. t1 := time.Now()
  76. fmt.Printf("Cost time %v\n", t1.Sub(t0))
  77. read2(file)
  78. t2 := time.Now()
  79. fmt.Printf("Cost time %v\n", t2.Sub(t1))
  80. read3(file)
  81. t3 := time.Now()
  82. fmt.Printf("Cost time %v\n", t3.Sub(t2))
  83. }

Go 文件读写操作 - 图5