Golang 读取文件的方式

程序中经常会出现文件的的读写操作,当然读取文件也有很多的方式;如:

  1. 一次性读取文件的全部内容
  2. 一次读取一行内容
  3. 按字节读取

下面是几种 Golang 读取文件的方式,代码如下所示

一次性读取文件的全部内容到内存
func main() {
    filename := flag.String("f", "", "Specify the file name")
    flag.Parse()

    if filename == nil || len(*filename) == 0 {
        flag.Usage()
        os.Exit(1)
    }

    contents, err := ioutil.ReadFile(*filename)
    if err != nil {
        log.Printf("Failed to read file %s,err:%s", *filename, err.Error())
        os.Exit(1)
    }
    fmt.Println(string(contents))
}
一次只读取一行
func main() {
    filename := flag.String("f", "", "Specify the file name")
    flag.Parse()

    if filename == nil || len(*filename) == 0 {
        flag.Usage()
        os.Exit(1)
    }

    f,err := os.Open(*filename)
    if err != nil{
        log.Printf("Failed to open file %s,err:%s",*filename,err.Error())
        os.Exit(1)
    }
    defer f.Close()
    buf := bufio.NewReader(f)
    for {
        line,err := buf.ReadBytes('\n')
        log.Print(string(line))

        if err != nil{
            if err == io.EOF{
                log.Println("end of file")
                break
            }else {
                log.Printf("read file err:%s",err.Error())
                break
            }
        }
    }
}
按字节读取文件内容
func main() {
    filename := flag.String("f", "", "Specify the file name")
    flag.Parse()

    if filename == nil || len(*filename) == 0 {
        flag.Usage()
        os.Exit(1)
    }

    f, err := os.Open(*filename)
    if err != nil {
        log.Printf("Failed to read file %s,err:%s", *filename, err.Error())
        os.Exit(1)
    }
    //指定一次读取的文件大小
    buf := make([]byte, 64)
    for {
        n, err := f.Read(buf)
        if err != nil && err != io.EOF {
            log.Printf("Failed to read,err:%s", err.Error())
            break
        }
        if n == 0 {
            break
        }
        fmt.Print(string(buf[:n]))
    }
}