字節輸入輸出流總結 FileInputStream FileOutputStream

字節流總結:

1. 判斷使用輸入流還是輸出流的依據

  • 以當前程序(也就是內存)爲參照物,從硬盤向內存中讀取數據,使用輸入流 FileInputStream。從內存向硬盤寫出數據,使用輸出流 FileOutputStream。

2. FileInputStream 讀取文件

    使用FIleInputStream讀取文件時,我們通常維護一個緩衝數組來提高讀取效率。假如我們維護的這個緩衝字節數組的長度是5,而我們讀取的文件內數據的長度是8。那麼當我們使用 new String() 來構建字符串時,它是怎麼讀取的呢?

    使用緩衝數組讀取文件內容,然後構建字符串,有兩種情況,第一種是覆蓋式的讀取,第二種是先清空再填充。兩種方式如下圖:

3. BufferedInputStream 讀取效率比 FileInputStream 高的原因?

     BufferedInputStream 的類內部,維護了一個緩存數組。但是它不具備讀文件的功能,需要依賴 FileInputStream 的read()方法將文件中的數據讀取到內存中,BufferedInputStream 在類的內部維護了一個 8kb的數組,FileInputStream 的 read() 方法將硬盤中的數據讀取到這個緩存數組中,然後 BufferedInputStream才能使用 read() 方法從這個數組中讀取數據。

    BufferedInputStream 每次讀取一個字節的數據,而 FileInputStream 每次也讀取一個字節的數據,那麼爲什麼 BufferedInputStream 讀取效率要高於 FileInputStream呢?

    看段源碼比較一下

通過源碼我們可以看出:

      FileInputStream每次讀取完一個字節,就傳輸一個字節,這消耗了大量的傳輸時間。

      而 BufferedInputStream,每次讀取一個字節,然後將這個字節放入緩存數組中,當讀取了8kb的數據或者沒有數據可讀時,會一次性傳輸一個數組長度(即8kb)的數據,這樣節省了大量的傳輸時間。

    因此可以得出結論,BufferedInputStream 讀取數據的效率比 FileInputStream 讀取數據的效率要高的多。

 

既然BufferedInputStream 的工作效率要比 FileInputStream 讀取數據的工作效率高的多,那麼我們是不是以後再工作中要是用 BufferedInputStream來進行硬盤與內存之間的數據傳輸呢?

    在使用 FileInputStream讀取文件數據時,我們並沒有一個字節一個字節的去讀取文件,而是經常會自己去維護一個緩存字節數組,這個數組的大小是1024的倍數。而BufferedInputStream 內部也是維護了一個長度爲 8192 字節(即8kb大小)的緩存數組。BufferedInputStream 的緩衝數組大小是固定的,而我們自己維護的緩存數組的大小是可變的,更具有靈活性。

    使用FileInputStream 可以直接讀取文件數據內容,而 BufferedInputStream 需要藉助FileInputStream 的 read()方法先將文件內容讀取到緩存數組中,再使用 BufferedInputStream 的 read() 方法讀取緩存數組中的數據,通過源碼我們也能看出來,BufferedInputStream 的 read() 方法在讀取緩存數組中的數據時,每次讀取讀需要進行 if判斷,這樣浪費了大量的時間,理想上來說,使用緩衝數組的 FileInputStream的工作效率要高於 BufferedInputStream的工作效率。

所以從習慣上或者理想狀態來講,個人都比較推薦使用 FileInputStream。

如有錯誤處,歡迎大佬進行指正。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章