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