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()方法,
上面的例子就是其中一個原因了。
閱讀更多 Java高併發框架 的文章