GO语言基础语法 | 青训营笔记

112 阅读2分钟

在Golang中读取文件一共有四种方法,分别是:file.Read, ioutil.ReadFile, bufio.NewReader, ioutil.ReadAll读取文件

使用 file.Read 读取文件时,首先,我们需要打开文件,接着, 使用打开的文件返回的文件句柄,来读取文件

文件读取结束的标志是返回的 n 等于 0,因此,如果我们需要读取整个文件内容,那么我们需要使用for循环不停的读取文件,直到 n 等于 0。

使用时需要先用os.Open打开一个文件,通过返回的file,在创建一个[]byte切片buf,然后使用file.Read(buf),返回读取的字节数n,读取出的内容被存放在buf[0:n]中,用for循环读取直到n为0时读取结束。

package main

import (
   "flag"
   "fmt"
   "os"
)

func Cat(f *os.File) {
   const NBUF = 512
   var buf [NBUF]byte
   for {
      switch nr, err := f.Read(buf[:]);true{
      case nr<0:
         fmt.Println(os.Stderr,"cat: error reading: %s\n",err.Error())
         os.Exit(1)
      case nr == 0:
         return
      case nr>0:
         if nw,ew := os.Stdout.Write(buf[0:nr]);nw!=nr{
            fmt.Fprintf(os.Stderr,"cat: error writing: %s\n",ew.Error())
         }

      }
   }
}
func main()  {
   flag.Parse()
   if flag.NArg() == 0{
      Cat(os.Stdin)
   }
   for i:=0;i<flag.NArg();i++{
      f,err:=os.Open(flag.Arg(i))
      if f == nil {
         fmt.Fprintf(os.Stderr,"cat",flag.Arg(i),err)
         os.Exit(1)
      }
      Cat(f)
      f.Close()
   }
}

注意最后需要使用file.close()关闭文件

bufio.NewReader()读取文件

首先,我们使用 os.Open 打开文件,如果文件打开成功,那么就使用defer来关闭文件。接着,使用打开的文件返回的文件句柄当作函数参数传入 NewReader,并使用 NewReader 返回的 reader 对象调用 Read 来读取文件。

最后,我们使用 for循环来不停的读取文件,直到出现错误或者读取到的文件内容的长度为 0,说明读取结束,结束循环。

每执行一次循环后,我们将读取到的内容追加到缓冲区,最后,我们打印整个缓冲区的内容,就是读取到的文件内容。

而ioutil.ReadAll()函数则是一次性把文件全部读取出来返回一个[]byte切片,加上string()后可直接打印出来, 不需要for循环