“你好,阿米戈!今天我們將熟悉輸入/輸出流。我們幾天前選擇了這個主題,但今天我們將深入探討它。輸入/輸出流分為 4 類:”
1)流按方向分為:輸入流和輸出流
2)流根據它們的數據類型劃分:那些與字節一起工作的和那些與字符一起工作的。
這些部門在表格中表示:
輸入流 | 輸出流 | |
---|---|---|
適用於字節 | 輸入流 | 輸出流 |
與角色一起工作 | 讀者 | 作家 |
如果一個對象實現了InputStream接口,那麼它支持從中順序讀取字節的能力。
如果對象實現了OutputStream接口,那麼它支持按順序向其寫入字節的能力。
如果一個對象實現了Reader接口,那麼它就支持從中順序讀取字符 (chars) 的能力。
如果一個對象實現了Writer接口,那麼它就支持向其順序寫入字符 (chars) 的能力。
輸出流就像一台打印機。我們可以將文檔輸出到打印機。我們可以將數據輸出到輸出流。
就其本身而言,輸入流可以比作掃描儀,或者可能是電源插座。使用掃描儀,我們可以將文件帶到我們的計算機上。或者我們可以插入電源插座並從中獲取電力。我們可以從輸入流接收數據。
“它們用在什麼地方?”
“這些類在 Java 中隨處可見。我們熟悉的朋友System.in是System類中名為in的靜態InputStream變量。”
“真的嗎?!所以我一直在使用 InputStream 而我什至沒有意識到它。System.out 也是一個流嗎?”
“是的,System.out是System 類中的靜態PrintStream ( OutputStream的後代)變量。”
“你的意思是,我一直都在用流,卻不知道?”
“是的,這只是告訴我們這些流有多麼方便。你只需抓住一個並使用它。”
“但你不能這麼說 System.in。我們經常不得不向它添加 BufferedReader 或 InputStreamReader。”
“的確如此。不過也是有原因的。”
有很多數據類型,也有很多使用它們的方法。因此,標準 I/O 類的數量增長非常快,儘管它們以幾乎相同的方式做所有事情。為了避免這種複雜性,Java 開發人員使用了抽象原則,將類分成許多小部分。
但如果需要,您可以以連貫的方式連接這些部分並獲得非常複雜的功能。看這個例子:
向控制台輸出一個字符串 |
|
將控制台輸出流存儲在單獨的變量中。 將字符串輸出到流中。 |
|
在內存中創建一個動態(擴展)字節數組。 將它連接到一個新的輸出流(PrintStream 對象)。 將字符串輸出到流中。 |
|
“老實說,這就像樂高積木。只是我不清楚這段代碼在做什麼。”
“暫時不用擔心這個。一切都在適當的時候。”
這就是我要您記住的:如果一個類實現了 OutputStream 接口,您可以向它寫入字節。幾乎就像您將數據輸出到控制台一樣。它用它做什麼是它的事。使用我們的“樂高套件”,我們不關心每個單獨部分的用途。我們關心這樣一個事實,即大量的零件選擇讓我們能夠構建如此酷的東西。
“好吧。那我們從哪裡開始呢?”