zoukankan      html  css  js  c++  java
  • Go -- 读取文件内容

    Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。

    一次性读取

    小文件推荐一次性读取,这样程序更简单,而且速度最快。

    代码如下:
    func ReadAll(filePth string) ([]byte, error) {
     f, err := os.Open(filePth)
     if err != nil {
      return nil, err
     }
     
    
     return ioutil.ReadAll(f)
    }


    还有更加简单的方法,我经常使用ioutil.ReadFile(filePth)

    分块读取

    可在速度和内存占用之间取得很好的平衡。

    代码如下:
    package main
     import (
    
     "bufio"
     "io"
     "os"
    )
    
    func processBlock(line []byte) {
     os.Stdout.Write(line)
    }
    
    func ReadBlock(filePth string, bufSize int, hookfn func([]byte)) error {
     f, err := os.Open(filePth)
     if err != nil {
      return err
     }
     defer f.Close()
    
     buf := make([]byte, bufSize) //一次读取多少个字节
     bfRd := bufio.NewReader(f)
     for {
      n, err := bfRd.Read(buf)
      hookfn(buf[:n]) // n 是成功读取字节数
    
      if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
       if err == io.EOF {
        return nil
       }
       return err
      }
     }
    
     return nil
    }
    
    func main() {
     ReadBlock("test.txt", 10000, processBlock)
    }

    逐行读取

    逐行读取有的时候真的很方便,性能可能慢一些,但是仅占用极少的内存空间。

    代码如下:
    package main
     
    
    import (
     "bufio"
     "io"
     "os"
    )
    
    func processLine(line []byte) {
     os.Stdout.Write(line)
    }
    
    func ReadLine(filePth string, hookfn func([]byte)) error {
     f, err := os.Open(filePth)
     if err != nil {
      return err
     }
     defer f.Close()
    
     bfRd := bufio.NewReader(f)
     for {
      line, err := bfRd.ReadBytes('
    ')
      hookfn(line) //放在错误处理前面,即使发生错误,也会处理已经读取到的数据。
      if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
       if err == io.EOF {
        return nil
       }
       return err
      }
     }
     return nil
    }
    
    func main() {
     ReadLine("test.txt", processLine)
    }

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/mafeng/p/7680451.html
Copyright © 2011-2022 走看看