更新時間:2020-11-19 17:22:27 來源:動力節點 瀏覽2499次
我們在初學Java時,不可避免地要學習到IO流,事實上,IO流對于初學者來說是一個很頭疼的東西,Java IO 體系看起來類很多,感覺很復雜,但其實是 IO 涉及的因素太多了。在設計 IO 相關的類時,編寫者也不是從同一個方面考慮的,所以會給人一種很亂的感覺,并且還有設計模式的使用,使得IO流分類更加復雜,所以本文特地對Java的IO流進行全面的分類。
我們將根據下面的IO流分類圖來對IO流進行介紹:
1.按流向劃分,分為輸入流、輸出流
請注意,這里的流向是以程序的運行時內存為參照的。
輸入流類名中包含關鍵字InputStream或Reader,輸出流類名中包含關鍵字OutputStream或Writer。
2.按操作的數據單元類型劃分,分為字節流、字符流
字節流操作的數據單元是8位的字節(byte),字符流操作的是16位的字符。
字節流類名中包含關鍵字InputStream或OutputStream,字符流類名中包含關鍵字Reader或Writer。
請注意,系統輸入輸出(System.in與System.out)都為字節流。
3.按流的角色來劃分,分為節點流與處理流
節點流是指程序可以向一個特定的節點讀寫數據,直接連接數據源;
這個節點最常見的是文件,類名中包含關鍵字File;還可以是數組、管道、字符串,關鍵字分別為ByteArray/CharArray,Piped,String。
處理流并不直接連接數據源,它大多情況是對已存在的節點流進行包裝,是一種典型的裝飾器設計模式。使用處理流主要是為了更方便的執行輸入輸出工作,如PrintStream,輸出功能很強大,推薦輸出時都使用處理流包裝。
注意:一個IO流可以即是輸入流又是字節流又或是以其他方式分類的流類型,是不沖突的。比如FileInputStream,它既是輸入流又是字節流還是文件節點流。
4.一些特別的的流類型
轉換流,轉換流只有字節流轉換為字符流,因為字符流使用起來更方便,我們只會向更方便使用的方向轉化。如:InputStreamReader與OutputStreamWriter。
緩沖流,有關鍵字Buffered,也是一種處理流,為其包裝的流增加了緩存功能,提高了輸入輸出的效率,增加緩沖功能后需要使用flush()才能將緩沖區中內容寫入到實際的物理節點。但是,在現在版本的Java中,只需記得關閉輸出流(調用close()方法),就會自動執行輸出流的flush()方法,可以保證將緩沖區中內容寫入。
對象流,有關鍵字Object,主要用于將目標對象保存到磁盤中或允許在網絡中直接傳輸對象時使用(對象序列化),具體可參看博客Java序列化與反序列化。
推回輸入流,有關鍵字PushBack,當程序調用推回輸入流的unread()方法時,系統回把指定數組內容的內容推回到一個推回緩沖區中,在調用read()方法讀入內容時,就先從推回緩沖區中讀取,直到讀完推回緩沖區中內容后才會從原輸入流中讀取。
流是一種抽象概念,它代表了數據的無結構化傳遞。IO流就是以流的方式進行輸入輸出,因此,IO流也是以此為基礎來進行分類的。看完了本文對IO流分類的講解,小伙伴們是不是已經徹底掌握了呢?如果還沒有掌握IO流的分類也沒有關系,本站的Java基礎教程里還有更詳細的講解,一定能讓你輕松掌握IO流分類。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習