Java的IO是一個大知識點,
如果把它的知識點拆開來說的話估計能說一個星期,關於IO的體係可以看看下面這張圖,
接下來我們從一段代碼開始聊吧,先看看下面這段代碼
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(); }}代碼中構造了一個緩衝流,然後往流裡寫入一個KB長度的數據,最後調用flush()方法。
這是很簡單的一段代碼,最終的輸出結果是會生成一個1KB的text.text文件。
但如果我們把最後一行註釋掉的話
//bos.flush();
最終生成的text.text大小會變成0.
這個結果是很顯然的,不過如果我們把flush()換成close()的話,結果是不是還會是0呢?
關於flush
flush()這個東西,其實在很久以前的網絡傳輸中就有了
那個時候為了效率,服務器和客戶端傳輸數據的時候不會每產生一段數據就傳一段數據
而是會建一個緩衝區,在緩衝區滿之後再往客戶端傳輸數據
有時候會有這樣的問題,當數據不足以填充緩衝區,而又需要往客戶端傳數據,為了解決這個問題,就有了flush的概念,將緩衝區的數據強迫發送。
回到上面的問題,如果把flush換成close是否可行呢
答案是可以的。
如果看源碼就知道BufferedOutputStream的繼承關係
public class BufferOutputStream extends FilterOutputStream
BufferedOutputStream沒有實現close()方法,所以會直接調用FilterOutputStream的close(),而FilterOutputStream的close()方法會調用flush()來輸出緩衝區數據。
實際開發中關於IO操作的,都強調最後要調用close()方法,上面的例子就是其中一個原因了。