我就废话不多说了,大家还是直接看代码吧~
补充:golang读取文件和处理超大文件方案
Golang 操作文件的读取的方法很多,适用的场景也是各不相同,在此我们将文件的读取分为如下几种 :
文件整体读取
文件分片读取(块级读取)
文件行级读取
系统的配置不同,执行的耗时也不相同,此处给出一参考
系统配置 :
OS : Windows10
Memory : 16G
CPU (英特尔)Intel® Core™ i3-4370 CPU @ 3.80GHz(3800 MHz)
1. 文件整体读取
文件整体读取就是将文件一次性读取到,理解上是将文件的内容第一次就读取完了
使用场景 :
针对小文件比较合适(大文件读取空间和时间的消耗也很大)
对于整体性强的文件也比较合适(文件也不能太大)
代码示例1
代码示例2
2. 文件分片读取
对文件一部分一部分逐步的读取,直到文件完全读取完
PS : 每次读取文件的大小是根据设置的 分片 大小 ,所以对于读取文本类型的文件时(例如 : 日志文件)
不一定是按照你的期望逐行输出,因为不会处理文本尾部的换行符,而是按照分片大小读取内容
使用场景 :
读取超大的文件很合适
读二进制类型的文件很合适(比如:音视频文件或者资源类型文件等)
代码示例
3. 文件逐行读取
对文件一行一行的读取,直到读到文件末尾
使用场景 :
读取超大的文件很合适(例如 : 超大log文件等)
读取的文件最好是有换行的(如果使用单行文件组成的大文件,需要注意)
对需要分析内容的大文件
统计某些数据出现的次数
查询某些数据是否存在
查找指定行的数据
示例代码1
代码示例2
4. 总结
面试中常见的类似超大文件读取的问题,通常我们采用分片读取或者逐行读取的方案即可
大文件的上传也可以采用类似的解决方案 , 每次读取文件的部分内容上传(写入)网络接口中,直至文件读取完毕
普通的小文件并且对内容没有太多操作的,可以采用整体读取,速度相对较快
对文件内容有操作的采用分片读取和逐行读取更合适
二进制类型文件采用分片读取或者整体读取的方案比较合适
文件读取不仅是本地文件,要读去网络上的文件(各种文档,音视频,图片,和其他各种类型文件)时要访问到文件获取 io.ReadCloser 或者 io.Reader 后可以采用三种方式将文件内容读取到
func ReadAll(r io.Reader) ([]byte, error) 文件完整读取
func Copy(dst Writer, src Reader) (written int64, err error) 文件读取并写入
通过Reader 接口的 Read 方法读取
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。