? ? ? ? 在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ù)源)

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

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

? ? ? ? 優(yōu)點(diǎn):
? ? ? ? ? ? ? ? →性能的提高:主要以增加緩沖的方式來提高輸入/輸出的效率。
? ? ? ? ? ? ? ? →操作的便捷:處理流提供了一系列的便捷方式來一次性的輸入/輸出大量的內(nèi)容,而不是輸出/輸入一個(gè)或多個(gè)“水滴”。
????????即我們使用處理流,將這些已存在的節(jié)點(diǎn)流包裝成高級處理流,我們就可以使用相同的代碼對這些不同的輸入輸出設(shè)備進(jìn)行讀寫操作!