CodeMonkey流水账:Road of Go:io.Copy
程序员文章站
2022-06-16 21:10:05
...
(一)Go不需要用buffer循环拷贝
我们用C或者Java拷贝数据,通常都是申请一块缓存,拷贝来源,写入目标。
解压/压缩文件同理,只是来源或目标换成压缩类的流。
像下面的:
byte[] buf=new byte[bufferSize];
while ((num = fin.read(buf,0,buf.length)) != -1){
fout.write(buf,0,num);
}
但Go不用这么麻烦,可以直接用io.copy拷贝,如下:
_, err = io.Copy(fout, fin)
(二) 用缓存就别忘记Flush
如下:如果你用了io.copy,写入的是bufio的Writer,就得小心了。
bfout := bufio.NewWriter(fout)
_, err = io.Copy(fout, fin)
bfout.Flush()
如果是Java或者C++,我记得没有调Flush缓存也只是没有立即写入磁盘文件而已,然鹅最终还是会写入的。但是go比较神奇,你不调Flush又用io.Copy,那么最后一块缓存(缺省4kb)就不会写入文件。于是就会少拷贝/解压一小部分内容,神奇。。。
下一篇: 第20节 排序的概念及分类