IO流中緩衝流的學習與理解

2021-10-02 08:41:19 字數 1178 閱讀 7798

緩衝流這個概念是針對底層流來說的,屬於高層次的流,在平常的底層流(位元組輸入流)的使用中,發現的問題就是效率比較低,cpu與io的互動比較慢,原因主要在於io是慢速裝置,在僅僅使用位元組流來單位元組讀寫時,cpu需要經常等待io,所以導致讀寫效率太低。此時,引入緩衝的概念,先把多個位元組的資料放入記憶體,眾所周知,記憶體的速度要比io快的多的多,雖然也趕不上cpu,但已經好很多了,cpu直接與記憶體互動,這自然提高效率。緩衝流的存在更像是套在底層流身上的乙個外骨骼機甲,緩衝流物件進行什麼動作,底層流也會進行什麼動作,只用操作一次,不過因為資料在緩衝區,所以底層流真正處理資料是在資料從緩衝區流到底層流之後才會進行,動作相當於有點延遲,讓子彈飛一會兒的感覺。

位元組流中是可以使用位元組陣列的,一次讀取多個,放到陣列中,而不是一次讀取乙個那麼慢,可以提高讀寫的效率。而使用位元組陣列與緩衝流是不衝突的,我還想了好一會兒,想比一比那個更好,但其實兩個可以一起使用。緩衝流是讀取了暫時先放在緩衝區中,之後再給底層流;而位元組陣列是用在一次讀取乙個還是讀取好幾個的問題上,所以兩個可以組合使用,也沒必要討論誰的效率更高。

在建立緩衝流物件時,可以指定緩衝區的大小,也可以不指定。預設的緩衝區大小是8192個位元組,這個貌似是比較優的乙個大小,當然,緩衝區太大了浪費記憶體,太小了影響效率,具體還是看處理檔案大小時考慮。當緩衝區未滿時,資料存在緩衝區,此時我們若需要將緩衝區的資料送到底層流,讓資料進行真正的被操作,則需要重新整理一下。重新整理就是講緩衝區的資料送到底層流,這裡用flush()方法。值得注意的兩個點:

1.當緩衝區被裝滿了時,緩衝區會自動flush,所以不需要額外操作,過多的flush沒有意義且降低效率

2.close()釋放資源時實際會預設呼叫一次flush

所以綜上兩點,我們只需要記得在最後釋放資源即可,一般情況下不太需要糾結flush

將乙個600m左右的檔案從乙個資料夾複製到另乙個資料夾。

單個位元組讀寫(位元組流)

1024位元組陣列讀寫(位元組流)

one thousand years···

3544ms

單個位元組讀寫(緩衝流)

1024位元組陣列讀寫(緩衝流)

19134ms

866ms

由上表可見,緩衝流的效率提公升超級明顯

使用位元組陣列也是提公升的比較高

兩者組合,更好

總的來說,緩衝流就是為了提高讀寫效率,緩解裝置間速度差異過大的問題,和計算機中的快取乙個道理,一般使用的話似乎只要會用就行。

基於流的I O 流與緩衝

基於流的操作最終都會呼叫read或write進行操作。即流的內部封裝了這兩個系統呼叫。緩衝分如下三種 全緩衝 相應巨集 io full buf 直到緩衝區被填滿,菜呼叫系統i o函式。磁碟檔案讀寫通常是全緩衝的。行緩衝 相應巨集 io line buf 直到遇到換行符 n 才呼叫系統i o函式。標準...

IO流 位元組緩衝流,字元緩衝流

處理流 裝飾流 位元組緩衝流,字元緩衝流 用於提高位元組流的效能 bufferedinputstream,bufferedoutputstream 位元組緩衝流 bufferedinputstream is newbufferedinputstream new fileinputstream fil...

I O基礎流 緩衝流

io流 字元流 轉換流 以下三句話功能相同 1 inputstreamreader isr new inputstreamreader new fileinputstream a.txt 預設字符集。2 inputstreamreader isr new inputstreamreader new ...