05.31 Java高級編程——Java IO的flush

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()方法,

上面的例子就是其中一個原因了。