java的io是一個(gè)大知識(shí)點(diǎn),
如果把它的知識(shí)點(diǎn)拆開來說的話估計(jì)能說一個(gè)星期,關(guān)于io的體系可以看看下面這張圖,
接下來我們從一段代碼開始聊吧,先看看下面這段代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class test { public static void main(string[] args) throws exception { file file = new file( "text.txt" ); if (!file.exists()) { file.createnewfile(); } fileoutputstream fos = new fileoutputstream(file); bufferedoutputstream bos = new bufferedoutputstream(fos); byte [] b = new byte [ 1024 ]; bos.write(b); bos.flush(); } } |
代碼中構(gòu)造了一個(gè)緩沖流,然后往流里寫入一個(gè)kb長(zhǎng)度的數(shù)據(jù),最后調(diào)用 flush()方法。
這是很簡(jiǎn)單的一段代碼,最終的輸出結(jié)果是會(huì)生成一個(gè) 1kb的 text.text文件。
但如果我們把最后一行注釋掉的話
//bos.flush();
最終生成的 text.text大小會(huì)變成0.
這個(gè)結(jié)果是很顯然的,不過如果我們把 flush()換成 close()的話,結(jié)果是不是還會(huì)是 0呢?
關(guān)于 flush
flush()這個(gè)東西,其實(shí)在很久以前的網(wǎng)絡(luò)傳輸中就有了
那個(gè)時(shí)候?yàn)榱诵剩?wù)器和客戶端傳輸數(shù)據(jù)的時(shí)候不會(huì)每產(chǎn)生一段數(shù)據(jù)就傳一段數(shù)據(jù)
而是會(huì)建一個(gè)緩沖區(qū),在緩沖區(qū)滿之后再往客戶端傳輸數(shù)據(jù)
有時(shí)候會(huì)有這樣的問題,當(dāng)數(shù)據(jù)不足以填充緩沖區(qū),而又需要往客戶端傳數(shù)據(jù),為了解決這個(gè)問題,就有了 flush的概念,將緩沖區(qū)的數(shù)據(jù)強(qiáng)迫發(fā)送。
回到上面的問題,如果把 flush換成 close是否可行呢
答案是可以的。
如果看源碼就知道 bufferedoutputstream的繼承關(guān)系
1
|
public class bufferoutputstream extends filteroutputstream |
bufferedoutputstream沒有實(shí)現(xiàn) close()方法,所以會(huì)直接調(diào)用 filteroutputstream的 close(),而 filteroutputstream的 close()方法會(huì)調(diào)用 flush()來輸出緩沖區(qū)數(shù)據(jù)。
實(shí)際開發(fā)中關(guān)于io操作的,都強(qiáng)調(diào)最后要調(diào)用 close()方法,上面的例子就是其中一個(gè)原因了。