為什么關(guān)閉一個(gè)緩沖區(qū)輸出流之前應(yīng)使用flush方法?
首先 解釋下這個(gè)flush的作用這個(gè)是java.io.OutputStream的 空實(shí)現(xiàn)(java.io.FileOutputStream使用的是java.io.OutputStream的實(shí)現(xiàn) java.net.SocketOutputStream也是一樣)
這個(gè)是java.io.BufferedOutputStream的為了防止過(guò)于頻繁的寫(xiě)操作 所以Java提供了一個(gè)java.io.BufferedOutputStream類(lèi) 內(nèi)部持有一個(gè)緩沖區(qū) 默認(rèn)不直接將數(shù)據(jù)寫(xiě)到硬盤(pán)上 而是存到緩沖區(qū)中 直到一定條件后觸發(fā)(就是調(diào)用上面的flushBuffer()了) 也可以強(qiáng)制通過(guò)flush()方法提前觸發(fā)所以當(dāng)你認(rèn)為你完成了某一個(gè)比較重要的操作的時(shí)候 最好進(jìn)行一次flush 防止數(shù)據(jù)在內(nèi)存中丟失========================以下是題外話=============================以上全部都是在語(yǔ)言層面上做出的優(yōu)化 實(shí)際運(yùn)行中 操作系統(tǒng)也會(huì)做優(yōu)化 并不是實(shí)際調(diào)用了write方法 數(shù)據(jù)就會(huì)落到硬盤(pán)上 因?yàn)椴僮飨到y(tǒng)有IO緩存 所以保證數(shù)據(jù)真正落地的方法不僅僅是調(diào)用flush 還要調(diào)用java.io.FileDescriptor#sync()方法 這個(gè)方法是本地方法 我沒(méi)看實(shí)現(xiàn) 不過(guò)應(yīng)該就跟下面這個(gè)鏈接里說(shuō)的是一回事文件I/O編程之sync、fsync和fdatasync函數(shù)