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

Java的IO是一個大知識點,

如果把它的知識點拆開來說的話估計能說一個星期,關於IO的體系可以看看下面這張圖,

(圖片是網上找的,侵刪)

Java高級編程——Java IO的flush

接下來我們從一段代碼開始聊吧,先看看下面這段代碼

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()這個東西,其實在很久以前的網絡傳輸中就有了,

那個時候為了效率,服務器和客戶端傳輸數據的時候不會每產生一段數據就傳一段數據,

而是會建一個緩衝區,在緩衝區滿之後再往客戶端傳輸數據,

Java高級編程——Java IO的flush

有時候會有這樣的問題,當數據不足以填充緩衝區,而又需要往客戶端傳數據,

為了解決這個問題,就有了 flush的概念,將緩衝區的數據強迫發送。

回到上面的問題,如果把 flush換成 close是否可行呢,

答案是可以的。

如果看源碼就知道 BufferedOutputStream的繼承關係,

public class BufferOutputStream extends FilterOutputStream

BufferedOutputStream沒有實現 close()方法,所以會直接調用 FilterOutputStream的 close(),

而 FilterOutputStream的 close()方法會調用 flush()來輸出緩衝區數據。

實際開發中關於IO操作的,都強調最後要調用 close()方法,

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

Java高級編程——Java IO的flush


分享到:


相關文章: