溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java緩沖輸出流的方法是什么

發(fā)布時間:2022-01-06 16:40:04 來源:億速云 閱讀:122 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“java緩沖輸出流的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

BFOS 的構(gòu)造需要傳入一個字節(jié)輸出流。

基本用法

這個流的功能可以根據(jù)名字看出來,是一個緩沖輸出流,可以當做一個緩沖區(qū),將輸出的字節(jié)暫時存在緩沖區(qū)里,那么當緩沖區(qū)滿了之后干嘛呢?那就需要將緩沖的數(shù)據(jù)都刷出去,刷到另一個流,因此在構(gòu)造的時候就需要傳入一個流。

有點類似游泳池,水滿了,就將水全部放掉,再灌新水。為了將水放掉,就需要給一個輸出的目的地,這個目的地就是構(gòu)造方法中需要傳入的下游的輸出流。其默認的緩沖區(qū)大小是 8KB。

java緩沖輸出流的方法是什么

注意這個過程,當寫到8KB時,數(shù)據(jù)還存在 BFOS 中,只要再寫一個字節(jié),就將之前緩沖滿的全部刷出去。如果緩沖區(qū)還沒滿就想將數(shù)據(jù)寫出去,需要手動 flush。

完整示例如下,這里我們的下游流用了個內(nèi)存數(shù)組流,并隨時查看內(nèi)存數(shù)組流的數(shù)據(jù)量。

java緩沖輸出流的方法是什么

運行結(jié)果:

0
8192
8195

之前介紹過列式存儲文件格式:大數(shù)據(jù)的列式存儲格式:Parquet

每一列的數(shù)據(jù)需要在內(nèi)存中用一個緩沖區(qū)管理,如果文件只有一列,那就需要一個緩沖區(qū),如果文件有多列,則需要多個緩沖區(qū)。在這里我們用單緩沖區(qū)多緩沖區(qū)來區(qū)分。之前我們的緩沖區(qū)用的是 BAOS,參考 java 字節(jié)流入門(內(nèi)存數(shù)組流->文件流)。那用 BFOS 可不可以?

單緩沖區(qū)

假如我們在內(nèi)存中只需要維護一個緩沖區(qū)的數(shù)據(jù),即一個字節(jié)數(shù)組。當我們想寫磁盤時,需要將 FOS 包裝一層 BAOS 或 BFOS,為了防止過多小數(shù)據(jù)量的寫操作,因此在內(nèi)存中做個緩沖,將很多小數(shù)據(jù)量寫操作轉(zhuǎn)化成很少的大數(shù)據(jù)量寫操作,充分利用磁盤的IO。

先比比速度,BFOS+FOS vs BAOS + FOS (內(nèi)存中只維護一個 BAOS 或一個 BFOS ,并接一個文件輸出流)哪種比較快?

做了個實驗,將800M數(shù)據(jù)通過兩種方式寫到文件中:

BufferedOutputStream + FileOutputStream

java緩沖輸出流的方法是什么

ByteArrayOutputStream + FileOutputStream

java緩沖輸出流的方法是什么

結(jié)果:BFOS + FOS 勝出。

java緩沖輸出流的方法是什么

BFOS 比 BAOS 還有一個好處,那就是可以控制內(nèi)存使用,不會無限制占用內(nèi)存。這是在單個數(shù)據(jù)緩沖區(qū)的時候,即內(nèi)存中只有一份緩沖數(shù)據(jù)。

多緩沖區(qū)

假如內(nèi)存中需要維護多個緩沖區(qū),每份緩沖區(qū)負責不同的數(shù)據(jù),對應到列式存儲中就是兩列,都需要寫到一個文件中,那么 BFOS+FOS 和 BAOS+FOS 這兩種搭配有啥區(qū)別?

由于 BFOS 的刷文件是由緩沖區(qū)滿觸發(fā)的,我們用橙色和紅色區(qū)分兩個緩沖流。假如緩沖流的緩沖區(qū)大小為 8KB,每個緩沖流都接收了 24KB 的數(shù)據(jù),但是數(shù)據(jù)并不是均勻來的,因此刷到文件中的順序是不固定的,也就是每個流會隨機觸發(fā) 3 次 flush。圖中 File 里每一小段是 8KB。兩個流最多需要的內(nèi)存是 16KB。

java緩沖輸出流的方法是什么

而使用 BAOS + FOS,假如需要明確將紅黃兩種數(shù)據(jù)分開存儲,不能互相交叉,則最多需要在內(nèi)存中緩存 48KB 數(shù)據(jù),等一個流緩沖了 24KB 后再寫文件。這樣就可以將紅黃兩種數(shù)據(jù)分隔開,但是先后順序不確定。

java緩沖輸出流的方法是什么

如果將紅黃分開是功能要求,在這種場景下,就必須使用 BAOS。

“java緩沖輸出流的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI