在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循环