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)就不会写入文件。于是就会少拷贝/解压一小部分内容,神奇。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值