深入理解Java IO的flush
Java的IO是一個(gè)大知識(shí)點(diǎn),
如果把它的知識(shí)點(diǎn)拆開(kāi)來(lái)說(shuō)的話估計(jì)能說(shuō)一個(gè)星期,關(guān)于IO的體系可以看看下面這張圖,

接下來(lái)我們從一段代碼開(kāi)始聊吧,先看看下面這段代碼
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è)緩沖流,然后往流里寫(xiě)入一個(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é)果是很顯然的,不過(guò)如果我們把 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ì)有這樣的問(wèn)題,當(dāng)數(shù)據(jù)不足以填充緩沖區(qū),而又需要往客戶端傳數(shù)據(jù),為了解決這個(gè)問(wèn)題,就有了 flush的概念,將緩沖區(qū)的數(shù)據(jù)強(qiáng)迫發(fā)送。
回到上面的問(wèn)題,如果把 flush換成 close是否可行呢
答案是可以的。
如果看源碼就知道 BufferedOutputStream的繼承關(guān)系
public class BufferOutputStream extends FilterOutputStream
BufferedOutputStream沒(méi)有實(shí)現(xiàn) close()方法,所以會(huì)直接調(diào)用 FilterOutputStream的 close(),而 FilterOutputStream的 close()方法會(huì)調(diào)用 flush()來(lái)輸出緩沖區(qū)數(shù)據(jù)。
實(shí)際開(kāi)發(fā)中關(guān)于IO操作的,都強(qiáng)調(diào)最后要調(diào)用 close()方法,上面的例子就是其中一個(gè)原因了。
相關(guān)文章
學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫(xiě)
這篇文章主要介紹了學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫(xiě),這個(gè)日歷小程序僅用簡(jiǎn)單的算法實(shí)現(xiàn)沒(méi)有用到date類等,但是帶有圖形界面,需要的朋友可以參考下2016-02-02
java實(shí)用型-高并發(fā)下RestTemplate的正確使用說(shuō)明
這篇文章主要介紹了java實(shí)用型-高并發(fā)下RestTemplate的正確使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
關(guān)于Http持久連接和HttpClient連接池的深入理解
眾所周知,httpclient是java開(kāi)發(fā)中非常常見(jiàn)的一種訪問(wèn)網(wǎng)絡(luò)資源的方式了,下面這篇文章主要給大家介紹了關(guān)于Http持久連接和HttpClient連接池的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Java連接redis報(bào)錯(cuò)timed?out問(wèn)題的解決辦法
最近項(xiàng)目開(kāi)發(fā)中用到了Redis,下面這篇文章主要給大家介紹了關(guān)于Java連接redis報(bào)錯(cuò)timed?out問(wèn)題的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
SpringBoot利用dag加速Spring beans初始化的方法示例
本文介紹了利用DAG加速SpringBoot中Spring beans初始化,先解釋了DAG 概念及特性,包括節(jié)點(diǎn)入度出度、拓?fù)渑判虻?接著闡述加速Spring Bean初始化的實(shí)現(xiàn)思路,如識(shí)別依賴關(guān)系構(gòu)建DAG、拓?fù)渑判?、并行初始化Bean及與Spring集成,還展示了相關(guān)代碼工程、測(cè)試結(jié)果及引用2024-12-12
Java中數(shù)學(xué)相關(guān)類的使用教程
Java是一種廣泛使用的編程語(yǔ)言,它提供了許多數(shù)學(xué)運(yùn)算的函數(shù)和方法,使得開(kāi)發(fā)者可以輕松地進(jìn)行各種數(shù)學(xué)計(jì)算,下面這篇文章主要給大家介紹了關(guān)于Java中數(shù)學(xué)相關(guān)類使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

