CodeMonkey流水账:Road of Go:io.Copy

(一)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(bfout, fin)
bfout.Flush()

如果是Java或者C++,我记得没有调Flush缓存也只是没有立即写入磁盘文件而已,然鹅最终还是会写入的。但是go比较神奇,你不调Flush又用io.Copy,那么最后一块缓存(缺省4kb)就不会写入文件。于是就会少拷贝/解压一小部分内容,神奇。。。

猜你喜欢

转载自blog.csdn.net/ddrfan/article/details/105711543