“你好,阿米戈!今天我們將熟悉輸入/輸出流。我們幾天前選擇了這個主題,但今天我們將深入探討它。輸入/輸出流分為 4 類:”

1)流按方向分為:輸入流輸出流

2)流根據它們的數據類型劃分:那些與字節一起工作的和那些與字符一起工作的。

這些部門在表格中表示:

輸入流 輸出流
適用於字節 輸入流 輸出流
與角色一起工作 讀者 作家

如果一個對象實現了InputStream接口,那麼它支持從中順序讀取字節的能力。

如果對象實現了OutputStream接口,那麼它支持按順序向其寫入字節的能力。

如果一個對象實現了Reader接口,那麼它就支持從中順序讀取字符 (chars) 的能力。

如果一個對象實現了Writer接口,那麼它就支持向其順序寫入字符 (chars) 的能力。

輸入/輸出流 - 1

輸出流就像一台打印機。我們可以將文檔輸出到打印機。我們可以將數據輸出到輸出流。

就其本身而言,輸入流可以比作掃描儀,或者可能是電源插座。使用掃描儀,我們可以將文件帶到我們的計算機上。或者我們可以插入電源插座並從中獲取電力。我們可以從輸入流接收數據。

“它們用在什麼地方?”

“這些類在 Java 中隨處可見。我們熟悉的朋友System.in是System類中名為in的靜態InputStream變量。”

“真的嗎?!所以我一直在使用 InputStream 而我什至沒有意識到它。System.out 也是一個流嗎?”

“是的,System.out是System 類中的靜態PrintStream ( OutputStream的後代)變量。”

“你的意思是,我一直都在用流,卻不知道?”

“是的,這只是告訴我們這些流有多麼方便。你只需抓住一個並使用它。”

“但你不能這麼說 System.in。我們經常不得不向它添加 BufferedReader 或 InputStreamReader。”

“的確如此。不過也是有原因的。”

有很多數據類型,也有很多使用它們的方法。因此,標準 I/O 類的數量增長非常快,儘管它們以幾乎相同的方式做所有事情。為了避免這種複雜性,Java 開發人員使用了抽象原則,將類分成許多小部分。

但如果需要,您可以以連貫的方式連接這些部分並獲得非常複雜的功能。看這個例子:

向控制台輸出一個字符串
System.out.println("Hello");
將控制台輸出流存儲在單獨的變量中。
將字符串輸出到流中。
PrintStream console = System.out;
console.println("Hello");
在內存中創建一個動態(擴展)字節數組。
將它連接到一個新的輸出流(PrintStream 對象)。
將字符串輸出到流中。
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

“老實說,這就像樂高積木。只是我不清楚這段代碼在做什麼。”

“暫時不用擔心這個。一切都在適當的時候。”

這就是我要您記住的:如果一個類實現了 OutputStream 接口,您可以向它寫入字節。幾乎就像您將數據輸出到控制台一樣。它用它做什麼是它的事。使用我們的“樂高套件”,我們不關心每個單獨部分的用途。我們關心這樣一個事實,即大量的零件選擇讓我們能夠構建如此酷的東西。

“好吧。那我們從哪裡開始呢?”