在日常编码中,常常也会遇到如何读取文件,其实读取文件看是简单,但是如果文件是一个特别大的文件,那么如何办呢?本文主要讲解下如何读取文件?

  • 整个文件读取
    • 适用场景:文件较小
  • 按照每行读取
    • 适用场景:如果是大文件,文件内容有严格的分行,可以使用分行读取
  • 按照块读取
    • 使用场景:超大文件

文件准备

$ ll -h
total 462M
-rw-r--r-- 1 zhj 197121  14M 6月   5 13:55 file_1.log
-rw-r--r-- 1 zhj 197121 414M 6月   5 13:54 file_2.log

整文件读取

示例1

常规读取文件操作

运行结果:

上面读取文件是我们一个比较常规的操作,但是实际在golang中,已经有包帮我们处理了这个读取,io/ioutil包就是干了这件事,下面示例2就是采用该包读取

示例2

运行结果:

是不是比示例1简单了很多,可以去看readFile的实现,内部的大致流程就是按照示例1去实现的。

分片读取

当一个文件是非常大,如20G的日志文件,我们按照上面的整个文件读取,其实是不现实的,可能内存都没有这么大,那么我们就要考虑分段读取。

分段读取的思路:

  • 设置一个容量的切片
  • 每次都读取固定长度的内容到切片中
  • 直到文件内容读取完为止

运行结果:

逐行读取

逐行读取适合大文件,逐行读取要求文件里面的内容一定是分行存储的,并且每行的内容不能过大。

方式一:

运行结果:

方法二:

执行结果:

总结:

  • 从以上三种读取文件的方式可以看出,整个文件读取的效率是非常高的,但是这种方式只适用于小文件,大文件这样读取可能造成内存溢出
  • 如果文件内容特别大,最好使用分片读取和逐行读取,但是逐行读取的文件要注意每行的内容不能太大,否则也会出现问题
  • 二进制文件适合使用整个文件读取和分片读取
  • 对文件内容需要处理最好选用分片读取和逐行读取