1、打开文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。

  1. //打开文件
  2. file, err := os.Open("./满江红")
  3. if err != nil {
  4. fmt.Println("err: ", err)
  5. }
  6. //关闭文件句柄
  7. defer file.Close()

2、读文件

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. )
  9. func readBytes(file *os.File) {
  10. var b = make([]byte, 3)
  11. n, err := file.Read(b)
  12. if err != nil {
  13. fmt.Println("err:", err)
  14. return
  15. }
  16. fmt.Printf("读取字节数:%d\n", n)
  17. fmt.Printf("切片值:%v\n", b)
  18. fmt.Printf("读取内容:%v\n", string(b[:n]))
  19. }
  20. func readLines(file *os.File) {
  21. reader := bufio.NewReader(file)
  22. for {
  23. // (1) 按行都字符串
  24. strs, err := reader.ReadString('\n') // 读取到换行符为止,读取内容包括换行符
  25. fmt.Print(err, strs)
  26. // (2) 按行都字节串
  27. // bytes, err := reader.ReadBytes('\n')
  28. // fmt.Print(bytes)
  29. // fmt.Print(string(bytes))
  30. if err == io.EOF { //io.EOF 读取到了文件的末尾
  31. // fmt.Println("读取到文件末尾!")
  32. break
  33. }
  34. }
  35. }
  36. func readFile() {
  37. content, err := ioutil.ReadFile("满江红") //包含了打开文件和读取整个文件,适用于较小文件
  38. if err != nil {
  39. fmt.Println("read file failed, err:", err)
  40. return
  41. }
  42. fmt.Print(string(content))
  43. }
  44. func main() {
  45. //打开文件
  46. file, err := os.Open("满江红") // 相对路径或者绝对路径
  47. if err != nil {
  48. fmt.Println("err: ", err)
  49. }
  50. //关闭文件句柄
  51. defer file.Close()
  52. // (1) 按字节读取数据
  53. // readBytes(file)
  54. // (2) 按行读取文件
  55. // readLines(file)
  56. // (3) 读取整个文件
  57. // readFile()
  58. }

3、写文件

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. )
  8. func writeBytesOrStr(file *os.File) {
  9. str := "满江红\n"
  10. //写入字节切片数据
  11. file.Write([]byte(str))
  12. //直接写入字符串数据
  13. file.WriteString("怒发冲冠,凭栏处、潇潇雨歇。")
  14. }
  15. func writeByBufio(file *os.File) {
  16. writer := bufio.NewWriter(file)
  17. //将数据先写入缓存,并不会到文件中
  18. writer.WriteString("大浪淘沙\n")
  19. // 必须flush将缓存中的内容写入文件
  20. // writer.Flush()
  21. }
  22. func writeFile() {
  23. str := "怒发冲冠,凭栏处、潇潇雨歇。"
  24. err := ioutil.WriteFile("满江红3", []byte(str), 0666)
  25. if err != nil {
  26. fmt.Println("write file failed, err:", err)
  27. return
  28. }
  29. }
  30. func main() {
  31. /*
  32. os.O_RDONLY: 以只读的方式打开
  33. os.O_WRONLY: 以只写的方式打开
  34. os.O_RDWR : 以读写的方式打开
  35. os.O_APPEND: 以追加的方式打开
  36. os.O_CREAT: 创建并打开一个新文件
  37. os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
  38. os.O_EXCL: 如果指定的文件存在,返回错误
  39. */
  40. file, err := os.OpenFile("满江红new", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
  41. if err != nil {
  42. fmt.Println("open file failed, err:", err)
  43. return
  44. }
  45. defer file.Close()
  46. // 写字节或者字符串
  47. writeBytesOrStr(file)
  48. // flush写
  49. writeByBufio(file)
  50. // 写文件
  51. writeFile()
  52. }

4、读写文件

读取一个文件前三行内容,并追加一行hello world

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. func main() {
  9. file, err := os.OpenFile("读写满江红", os.O_APPEND|os.O_RDWR, 0666)
  10. if err != nil {
  11. fmt.Println("open file failed, err:", err)
  12. return
  13. }
  14. defer file.Close()
  15. // 读取前三行内容
  16. reader := bufio.NewReader(file)
  17. fmt.Println("读取的前三行内容:")
  18. for i := 0; i < 3; i++ {
  19. // (1) 按行都字符串
  20. strs, err := reader.ReadString('\n') // 读取到换行符为止,读取内容包括换行符
  21. // (2) 按行都字节串
  22. // bytes, err := reader.ReadBytes('\n')
  23. if err == io.EOF { //io.EOF 读取到了文件的末尾
  24. // fmt.Println("读取到文件末尾!")
  25. break
  26. }
  27. fmt.Print(strs)
  28. }
  29. // 追加‘hello world’
  30. writer := bufio.NewWriter(file)
  31. //将数据先写入缓存,并不会到文件中
  32. writer.WriteString("hello world")
  33. // 必须flush将缓存中的内容写入文件
  34. writer.Flush()
  35. }