在日常编码中,常常也会遇到如何读取文件,其实读取文件看是简单,但是如果文件是一个特别大的文件,那么如何办呢?本文主要讲解下如何读取文件?
- 整个文件读取
- 适用场景:文件较小
- 按照每行读取
- 适用场景:如果是大文件,文件内容有严格的分行,可以使用分行读取
- 按照块读取
- 使用场景:超大文件
文件准备
$ 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的日志文件,我们按照上面的整个文件读取,其实是不现实的,可能内存都没有这么大,那么我们就要考虑分段读取。
分段读取的思路:
- 设置一个容量的切片
- 每次都读取固定长度的内容到切片中
- 直到文件内容读取完为止
运行结果:
逐行读取
逐行读取适合大文件,逐行读取要求文件里面的内容一定是分行存储的,并且每行的内容不能过大。
方式一:
运行结果:
方法二:
执行结果:
总结:
- 从以上三种读取文件的方式可以看出,整个文件读取的效率是非常高的,但是这种方式只适用于小文件,大文件这样读取可能造成内存溢出
- 如果文件内容特别大,最好使用分片读取和逐行读取,但是逐行读取的文件要注意每行的内容不能太大,否则也会出现问题
- 二进制文件适合使用整个文件读取和分片读取
- 对文件内容需要处理最好选用分片读取和逐行读取