1、创建一个新文件,并往里面写入5个 hello, Golang

准备

package os

func OpenFile(name string, flag int, perm FileMode) (file File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是
PathError。
image.png

  1. // package os
  2. // Constants
  3. const (
  4. O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
  5. O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
  6. O_RDWR int = syscall.O_RDWR // 读写模式打开文件
  7. O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
  8. O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
  9. O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
  10. O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
  11. O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
  12. )
  13. // 使用方式(组合模式)
  14. os.O_WRONLY | os.O_CREATE

package bufio

func NewWriter(w io.Writer) Writer
NewWriter创建一个具有默认大小缓冲、写入w的
Writer。
func (b Writer) *WriteString(s string) (int, error)
WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s),还会返回一个错误说明原因。

代码实现

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. )
  7. func main() {
  8. // 创建一个新文件,并往里面写入5个 hello, Golang
  9. // 1、打开 d:/abc.txt
  10. filePath := "d:/abc.txt"
  11. file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
  12. if err != nil {
  13. fmt.Println("打开文件失败")
  14. return
  15. }
  16. // 2、写入5个 hello, Golang , 使用带缓存的 *Write
  17. str := "hello, Golang\n"
  18. writer := bufio.NewWriter(file)
  19. for i := 0; i < 5; i++ {
  20. writer.WriteString(str)
  21. }
  22. // 3、将内容写入磁盘文件
  23. // 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
  24. // 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
  25. writer.Flush()
  26. // 4、操作完后,及时关闭文件,防止内存泄漏
  27. // 操作完后,及时关闭文件,防止内存泄漏
  28. defer func() {
  29. err = file.Close()
  30. if err != nil {
  31. fmt.Println("关闭文件错误")
  32. }
  33. }()
  34. }

实现效果

image.png

2、打开一个存在的文件,将原来的内容,覆盖成新的内容: “你好,Golang!”

代码实现

在上个案例的基础上,只需要修改 os.OpenFile 的文件打开模式,再重新写入即可
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件

  1. // 打开一个存在的文件,将原来的内容,覆盖成新的内容: “你好,Golang!”
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8. func main() {
  9. // 1、打开 d:/abc.txt
  10. filePath := "d:/abc.txt"
  11. file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666)
  12. if err != nil {
  13. fmt.Println("打开文件失败")
  14. return
  15. }
  16. // 2、写入5个 hello, Golang , 使用带缓存的 *Write
  17. str := "你好,Golang!\n"
  18. writer := bufio.NewWriter(file)
  19. for i := 0; i < 10; i++ {
  20. writer.WriteString(str)
  21. }
  22. // 3、将内容写入磁盘文件
  23. // 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
  24. // 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
  25. writer.Flush()
  26. // 4、操作完后,及时关闭文件,防止内存泄漏
  27. // 操作完后,及时关闭文件,防止内存泄漏
  28. defer func() {
  29. err = file.Close()
  30. if err != nil {
  31. fmt.Println("关闭文件错误")
  32. }
  33. }()
  34. }

实现效果

image.png

3、打开已存在的文件,在原先内容的基础上,追加 “ABC, ENGLISH!”

代码实现

O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部

  1. // 打开已存在的文件,在原先内容的基础上,追加 “ABC, ENGLISH!”
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8. func main() {
  9. // 1、打开 d:/abc.txt
  10. filePath := "d:/abc.txt"
  11. file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
  12. if err != nil {
  13. fmt.Println("打开文件失败")
  14. return
  15. }
  16. // 2、写入5个 hello, Golang , 使用带缓存的 *Write
  17. str := "ABC, ENGLISH!\r\n"
  18. writer := bufio.NewWriter(file)
  19. for i := 0; i < 10; i++ {
  20. writer.WriteString(str)
  21. }
  22. // 3、将内容写入磁盘文件
  23. // 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
  24. // 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
  25. writer.Flush()
  26. // 4、操作完后,及时关闭文件,防止内存泄漏
  27. // 操作完后,及时关闭文件,防止内存泄漏
  28. defer func() {
  29. err = file.Close()
  30. if err != nil {
  31. fmt.Println("关闭文件错误")
  32. }
  33. }()
  34. }

实现效果

image.png

4、打开已存在的文件,把内容显示到终端,并追加内容 “hello, beijing”

代码实现

  1. // 打开已存在的文件,把内容显示到终端,并追加内容 “hello, beijing”
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "os"
  8. )
  9. func main() {
  10. // 1、打开 d:/abc.txt
  11. filePath := "d:/abc.txt"
  12. file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
  13. if err != nil {
  14. fmt.Println("打开文件失败")
  15. return
  16. }
  17. // 2、读取内容,并显示在终端
  18. reader := bufio.NewReader(file)
  19. for {
  20. // 读到一个换行就结束
  21. str, err := reader.ReadString('\n')
  22. if err == io.EOF {
  23. // 读到一行末尾
  24. break
  25. }
  26. // 输出内容
  27. fmt.Print(str)
  28. }
  29. // 3、写入5个 hello, Golang , 使用带缓存的 *Write
  30. str := "hello, beijing!\r\n"
  31. writer := bufio.NewWriter(file)
  32. for i := 0; i < 10; i++ {
  33. writer.WriteString(str)
  34. }
  35. // 4、将内容写入磁盘文件
  36. // 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
  37. // 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
  38. writer.Flush()
  39. // 5、操作完后,及时关闭文件,防止内存泄漏
  40. defer func() {
  41. err = file.Close()
  42. if err != nil {
  43. fmt.Println("关闭文件错误")
  44. }
  45. }()
  46. }

实现效果

image.png
image.png