Java-IO流的理解

? ? ? ? 在Java中,把不同的輸入/輸出源(硬盤、文件和網(wǎng)絡(luò)連接等)抽象的表述為流(Stream),通過流的方式允許Java程序使用相同的方式訪問不同的輸入/輸出源。流(Stream)是從源(Source)到接受(Sink)的有序數(shù)據(jù)。



一、輸入流、輸出流

????????說白了,就是我們使用程序接收、發(fā)送數(shù)據(jù)到文件或者其他設(shè)備的過程中,這些數(shù)據(jù)不可能瞬間全部發(fā)送或接受完成,它們得如同排隊(duì)一樣,按照規(guī)則來,這種過程形式就是流,至于怎么個(gè)規(guī)則法,就看java.io包下的一系列的規(guī)定了。



? ? ? ? 所以,按照流的劃分,有輸入流、輸出流:

? ? ? ? ? ? ? ? 輸入流(以InputStream和Reader為基類):只能從中讀取數(shù)據(jù),不能夠反向向其寫入數(shù)據(jù)。

? ? ? ? ? ? ? ? ?輸出流(以O(shè)utputStream和Writer為基類):即只能從中寫入數(shù)據(jù)。

InputStream和Reader、OutputStream和Writer作為JavaIO流中涉及的40多個(gè)類的4個(gè)抽象基類,我們來看輸入、輸出流的模型圖(我們把輸入、輸出設(shè)備抽象理解為水管):


輸入流模型圖

? ? ? ? 輸入流使用隱式記錄指針來表示當(dāng)前準(zhǔn)備讀取的位置,每當(dāng)程序從InputStream或Reader取出一個(gè)或多個(gè)水滴后,記錄指針自動向后移動相應(yīng)的單位。


輸出流模型圖

? ? ? ? 輸出流同樣使用隱式記錄指針表示當(dāng)前水滴即將放入的位置,每當(dāng)程序向OutputStream或Writer輸出一個(gè)或多個(gè)水滴后,記錄指針自動向后移動相應(yīng)的單位。

關(guān)于InputStream、OutputStream和Reader、Writer的區(qū)別:前者為字節(jié)流,字節(jié)流操作的最小數(shù)據(jù)單元為8位的字節(jié)。后者為字符流,字符流操作的最小數(shù)據(jù)單元為16位的字符。

何時(shí)使用何流,我們看圖理解一下:

輸出流

? ? ? ? 我們在劃分輸入、輸出流的時(shí)候是根據(jù)程序運(yùn)行時(shí)所在的內(nèi)存來考慮的,所以,從內(nèi)存→硬盤,使用的應(yīng)當(dāng)是輸出流!


? ? ? ? 從Server到Client的過程中,我們使用網(wǎng)路傳輸數(shù)據(jù),那么Server將數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)過程中,應(yīng)當(dāng)使用的是輸出流,而Client從網(wǎng)絡(luò)中獲取數(shù)據(jù)的過程中,應(yīng)當(dāng)使用的是輸入流!



二、節(jié)點(diǎn)流、處理流

? ??????節(jié)點(diǎn)流:從/向一個(gè)特定的IO設(shè)備(如磁盤等)讀/寫數(shù)據(jù)的流稱為節(jié)點(diǎn)流,也稱低級流。(即程序直接連接到數(shù)據(jù)源)


節(jié)點(diǎn)流示意圖


?處理流:對一個(gè)已經(jīng)存在的流進(jìn)行連接或封裝,通過封裝后的流來進(jìn)行讀/寫操作,也稱為高級流。


處理流示意圖


至于使用處理流有什么好處,我們先來看處理流的模型:


處理流模型

? ? ? ? 優(yōu)點(diǎn):

? ? ? ? ? ? ? ? →性能的提高:主要以增加緩沖的方式來提高輸入/輸出的效率。

? ? ? ? ? ? ? ? →操作的便捷:處理流提供了一系列的便捷方式來一次性的輸入/輸出大量的內(nèi)容,而不是輸出/輸入一個(gè)或多個(gè)“水滴”。

????????即我們使用處理流,將這些已存在的節(jié)點(diǎn)流包裝成高級處理流,我們就可以使用相同的代碼對這些不同的輸入輸出設(shè)備進(jìn)行讀寫操作!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 概述 java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標(biāo)。java.io ...
    Steven1997閱讀 9,417評論 1 25
  • (因?yàn)榘l(fā)現(xiàn)有好多時(shí)候我都是只寫了一句話的,所以為了節(jié)省空白,就一個(gè)月的放在一起吧) #然后這樣框起來的就是我現(xiàn)在看...
    圈圈又青青閱讀 170評論 0 2

友情鏈接更多精彩內(nèi)容