打开文件

func Open(name string) (file File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是
PathError。

概念说明: file

  • file 对象
  • file 指针
  • file 文件句柄

    关闭文件

    func (f File) *Close() error
    Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

基础功能代码

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. file, err := os.Open("d:/test.txt")
  8. if err != nil {
  9. fmt.Println("err = ", err)
  10. }
  11. fmt.Printf("file: %v \n", file) // &{0xc00008e780} 文件指针/文件对象/文件句柄
  12. err = file.Close()
  13. if err != nil {
  14. fmt.Println("关闭文件错误")
  15. }
  16. /*
  17. 错误文件演示
  18. err = open d:/test01.txt: The system cannot find the file specified.
  19. file: <nil>
  20. 关闭文件错误
  21. */
  22. }

案例演示一(带缓冲-大文件)

读取文件内容,并显示在终端(带缓存区的方式),使用 os.Open(), file.Close(), bufio.NewReader(), reader.ReadString() 函数和方法

func NewReader(rd io.Reader) Reader
NewReader创建一个具有默认大小缓冲、从r读取的
Reader。

func (b Reader) *ReadString(delim byte) (line string, err error)
ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. func main() {
  9. file, err := os.Open("d:/test.txt")
  10. if err != nil {
  11. fmt.Println("err = ", err)
  12. } else {
  13. // 创建带缓冲的 *reader
  14. /* const (
  15. // 默认缓冲区 4096 并不是一次读取完成,读一部分处理一部分,这样可以处理一些比较大的文件
  16. defaultBufSize = 4096
  17. ) */
  18. reader := bufio.NewReader(file)
  19. // 循环读取内容
  20. for {
  21. // 读到一个换行就结束
  22. str, err := reader.ReadString('\n')
  23. if err == io.EOF {
  24. break
  25. }
  26. // 输出内容
  27. fmt.Print(str)
  28. }
  29. fmt.Println("文件读取结束")
  30. }
  31. fmt.Printf("file: %v \n", file) // &{0xc00008e780} 文件指针/文件对象/文件句柄
  32. /*
  33. 错误文件演示
  34. err = open d:/test01.txt: The system cannot find the file specified.
  35. file: <nil>
  36. 关闭文件错误
  37. */
  38. // 案例
  39. // 当函数退出时,要及时关闭file,否则会有内存泄露
  40. defer func() {
  41. err = file.Close()
  42. if err != nil {
  43. fmt.Println("关闭文件错误")
  44. }
  45. }()
  46. }

案例演示二(一次性读取-小文件)

func ReadFile(filename string) ([]byte, error)
ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。
因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。

  1. package main
  2. import "io/ioutil"
  3. func main() {
  4. // 一次性读取(小文件)
  5. file02, err := ioutil.ReadFile("d:/test.txt")
  6. if err != nil {
  7. fmt.Println("读取失败")
  8. }
  9. // 不需要显示的Open和Close, 都被封装到 ReadFile 函数里了
  10. fmt.Println("file02 = ", file02) // []byte
  11. // %s 直接输出字符串或者[]byte
  12. fmt.Printf("file02 = %s", file02)
  13. }