前面对golang中io读取文件的多种方式做了一个总结,这里记录下golang中文件下载保存的两种常用方式
- 小文件下载保存
小文件的话,因为http返回的Response.Body 对象是 io.ReadCloser类型,调用io/ioutil包提供的ReadAll可以将其内容全部读取放入一个临时的slice中,然后使用ioutil.WriteFile将内容写入目标文件中。 - 大文件下载保存
如果文件很大的,将文件内容全部读入一个临时的slice再一次性写入磁盘将占用大量的内存空间,同时写入效率也比较低。 比较推荐使用bufio包创建一个带缓冲区的writer对象,然后使用io.Copy方法实现 Response.Body这个reader到 writer对象的直接写入, 避免了内存大量占用的情况,同时提高了文件写入效率。
下面给出了两中方式的实现代码,先创建一个下载对象,如果是小文件读取,则可以最终调用downloadStraightly()函数去下载保存文件; 如果是大文件,则推荐使用downloadWithBuf()去下载保存文件。
- 测试前准备工作
1 | 创建一个test.txt文件,并在对应路径下使用python启动一个文件服务器,监听端口默认8000 |
- 测试完整代码
1 | /* |