天天看點

CodeMonkey流水賬:Road of Go:io.Copy(一)Go不需要用buffer循環拷貝(二) 用緩存就别忘記Flush

文章目錄

  • (一)Go不需要用buffer循環拷貝
  • (二) 用緩存就别忘記Flush

(一)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拷貝,如下:

(二) 用緩存就别忘記Flush

如下:如果你用了io.copy,寫入的是bufio的Writer,就得小心了。

之前寫錯了改一下:

bfout := bufio.NewWriter(fout)
_, err = io.Copy(bfout, fin)
bfout.Flush()
           

如果是Java或者C++,我記得沒有調Flush緩存也隻是沒有立即寫入磁盤檔案而已,然鵝最終還是會寫入的。但是go比較神奇,你不調Flush又用io.Copy,那麼最後一塊緩存(預設4kb)就不會寫入檔案。于是就會少拷貝/解壓一小部分内容,神奇。。。