您好,登錄后才能下訂單哦!
本篇內容介紹了“java緩沖輸出流的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
BFOS 的構造需要傳入一個字節輸出流。
基本用法
這個流的功能可以根據名字看出來,是一個緩沖輸出流,可以當做一個緩沖區,將輸出的字節暫時存在緩沖區里,那么當緩沖區滿了之后干嘛呢?那就需要將緩沖的數據都刷出去,刷到另一個流,因此在構造的時候就需要傳入一個流。
有點類似游泳池,水滿了,就將水全部放掉,再灌新水。為了將水放掉,就需要給一個輸出的目的地,這個目的地就是構造方法中需要傳入的下游的輸出流。其默認的緩沖區大小是 8KB。
注意這個過程,當寫到8KB時,數據還存在 BFOS 中,只要再寫一個字節,就將之前緩沖滿的全部刷出去。如果緩沖區還沒滿就想將數據寫出去,需要手動 flush。
完整示例如下,這里我們的下游流用了個內存數組流,并隨時查看內存數組流的數據量。
運行結果:
0
8192
8195
之前介紹過列式存儲文件格式:大數據的列式存儲格式:Parquet
每一列的數據需要在內存中用一個緩沖區管理,如果文件只有一列,那就需要一個緩沖區,如果文件有多列,則需要多個緩沖區。在這里我們用單緩沖區和多緩沖區來區分。之前我們的緩沖區用的是 BAOS,參考 java 字節流入門(內存數組流->文件流)。那用 BFOS 可不可以?
單緩沖區
假如我們在內存中只需要維護一個緩沖區的數據,即一個字節數組。當我們想寫磁盤時,需要將 FOS 包裝一層 BAOS 或 BFOS,為了防止過多小數據量的寫操作,因此在內存中做個緩沖,將很多小數據量寫操作轉化成很少的大數據量寫操作,充分利用磁盤的IO。
先比比速度,BFOS+FOS vs BAOS + FOS (內存中只維護一個 BAOS 或一個 BFOS ,并接一個文件輸出流)哪種比較快?
做了個實驗,將800M數據通過兩種方式寫到文件中:
BufferedOutputStream + FileOutputStream
ByteArrayOutputStream + FileOutputStream
結果:BFOS + FOS 勝出。
BFOS 比 BAOS 還有一個好處,那就是可以控制內存使用,不會無限制占用內存。這是在單個數據緩沖區的時候,即內存中只有一份緩沖數據。
多緩沖區
假如內存中需要維護多個緩沖區,每份緩沖區負責不同的數據,對應到列式存儲中就是兩列,都需要寫到一個文件中,那么 BFOS+FOS 和 BAOS+FOS 這兩種搭配有啥區別?
由于 BFOS 的刷文件是由緩沖區滿觸發的,我們用橙色和紅色區分兩個緩沖流。假如緩沖流的緩沖區大小為 8KB,每個緩沖流都接收了 24KB 的數據,但是數據并不是均勻來的,因此刷到文件中的順序是不固定的,也就是每個流會隨機觸發 3 次 flush。圖中 File 里每一小段是 8KB。兩個流最多需要的內存是 16KB。
而使用 BAOS + FOS,假如需要明確將紅黃兩種數據分開存儲,不能互相交叉,則最多需要在內存中緩存 48KB 數據,等一個流緩沖了 24KB 后再寫文件。這樣就可以將紅黃兩種數據分隔開,但是先后順序不確定。
如果將紅黃分開是功能要求,在這種場景下,就必須使用 BAOS。
“java緩沖輸出流的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。