1.OutputStream類
我們最近剛剛探索了輸入流。是時候討論輸出流了。
該類OutputStream是所有支持字節輸出的類的父類。這是一個抽像類,它自己什麼都不做,但它有適用於各種場合的子類。
這聽起來非常複雜。更簡單地說,此類對字節進行操作,而不是對字符或其他數據類型進行操作。而且它是抽象的這一事實意味著我們通常不使用它,而是使用它的後代類之一。比如,FileOutputStream之類的。
但是回到OutputStream課堂上。此類具有其所有後代類都必須實現的方法。以下是主要的:
| 方法 | 描述 |
|---|---|
|
將一個字節(不是int)寫入流。 |
|
將字節數組寫入流 |
|
將字節數組的一部分寫入流 |
|
將緩衝區中存儲的所有數據寫入流 |
|
關閉流 |
當您創建一個繼承類的對象時InputStream,您通常會指定一個從中讀取數據的源對象InputStream。當您創建一個繼承類的對象時OutputStream,您通常還會指定數據將寫入的目標對像或流。
讓我們簡要介紹一下該類的所有方法OutputStream:
write(int b)方法
此方法將一個字節(不是int)寫入輸出流。傳遞的值被強制轉換為一個字節,並且丟棄該 int 的前三個字節。
write(byte[] buffer)方法
將給定的字節數組寫入輸出流。就是這樣。
write(byte[] buffer, int offset, int length)方法
將傳遞的字節數組的一部分寫入輸出流。偏移量變量表示數組第一個元素的索引,是length要寫入的子集的長度。
flush()方法
該flush()方法用於強制將當前流中可能緩衝的任何數據寫入目標流。這在使用緩沖和/或排列在鏈中的多個流對象時是相關的。
close()方法
將任何未寫入的數據寫入目標對象。close()如果您使用塊,則無需調用該方法try-with-resources。
複製文件的例子
| 代碼 | 筆記 |
|---|---|
|
InputStream用於從文件中讀取OutputStream用於寫入文件將數據讀入的緩衝區 只要流中有數據 將數據讀入緩衝區 將緩衝區中的數據寫入第二個流 |
2.Writer類
該類Writer與類完全相同OutputStream,但只有一個區別:它使用字符 ( char) 而不是字節。
這是一個抽像類:您不能創建該類的對象Writer。它的主要目標是成為數百個後代類的公共父類,並為它們提供處理字符流的通用方法。
Writer該類(及其所有後代類)的方法:
| 方法 | 描述 |
|---|---|
|
將一個字符(不是int)寫入流。 |
|
將字符數組寫入流 |
|
將字符數組的一部分寫入流 |
|
將字符串寫入流 |
|
將字符串的一部分寫入流 |
|
將緩衝區中存儲的所有數據寫入流 |
|
關閉流 |
這些方法與類的方法非常相似OutputStream,但它們使用字符而不是字節。
方法說明:
write(int b)方法
此方法將單個字符 ( char— 而不是int) 寫入輸出流。傳遞的值被轉換為 a char,前兩個字節被丟棄。
write(char[] buffer)方法
將給定的字符數組寫入輸出流。
write(char[] buffer, int offset, int length)方法
將傳遞的字符數組的一部分寫入輸出流。該offset變量表示數組第一個元素的索引,length是要寫入的子集的長度。
write(String str)方法
將給定的字符串寫入輸出流。
write(String str, int offset, int length)方法
將給定字符串的一部分寫入輸出流:字符串被轉換為字符數組。該offset變量表示數組第一個元素的索引,length是要寫入的子集的長度。
flush()方法
該flush()方法用於強制將當前流中可能緩衝的任何數據寫入目標流。這在使用緩沖和/或排列在鏈中的多個流對象時是相關的。
close()方法
將任何未寫入的數據寫入目標對象。close()如果您使用塊,則無需調用該方法try-with-resources。
複製文本文件的程序示例:
| 代碼 | 筆記 |
|---|---|
|
Reader用於從文件中Writer讀取 用於寫入文件我們將讀取數據的緩衝區 只要流中有數據 將數據讀入緩衝區 將緩衝區中的數據寫入第二個流 |
StringWriter班級
還有一個有趣的類繼承了該類Writer:它被稱為StringWriter. 它包含一個可變字符串——一個StringBuffer對象。每次您向StringWriter對象“寫入”內容時,文本都會簡單地添加到其內部緩衝區中。
例子:
| 代碼 | 筆記 |
|---|---|
|
一個目標字符流( StringWriter)被創建一個字符串被寫入緩衝區裡面 StringWriter一個字符串被寫入緩衝區裡面 StringWriter一個對象的內容轉換成字符串 |
在這種情況下,該類StringWriter本質上是該類的包裝器StringBuffer,但該類StringWriter是流類的後代Writer,並且可以在流對象鏈中使用。這在實踐中是一個非常有用的屬性。
3.PrintStream類
輸出流類也可以放入帶有中間流的鏈中,中間流將數據寫入傳遞給它們的目標流。這些流交互的一般視圖如下所示:

所有中間輸出流中最有趣和通用的是PrintStream. 它有幾十個方法和多達12個構造函數。
類PrintStream繼承FilterOutputStream類,類繼承OutputStream。這意味著該類除了擁有自己的方法外,還PrintStream擁有父類的所有方法。以下是最有趣的:
| 方法 | 描述 |
|---|---|
|
將傳遞的對象轉換為字符串並將其輸出到目標流。 |
|
將傳遞的對象轉換為字符串並將其輸出到目標流。在末尾添加一個換行符 |
|
向目標流輸出一個換行符 |
|
根據格式字符串和傳遞的參數構造並輸出一個字符串;類似於String.format()方法 |
你問這幾十種方法在哪裡?
好吧,它有許多具有不同參數的print()和println()方法的變體。它們可以總結在此表中。
我們不會深入研究這些方法,因為您已經很了解它們。你能猜出我在說什麼嗎?
還記得System.out.println()嗎?但是可以寫成兩行:
| 代碼 | 控制台輸出 |
|---|---|
|
|
我們最喜歡的命令是調用類的靜態變量上的方法。這個變量的類型是.System.out.println()println()outSystemPrintStream
PrintStream在許多 CodeGym 關卡中,幾乎在每個任務中,您都在不知不覺中調用了類的方法!
實際使用
Java 有一個有趣的類ByteArrayOutputStream,它是一個動態增長的字節數組,它繼承了OutputStream.
對象ByteArrayOutputStream和PrintStream對象可以這樣鏈接:
| 代碼 | 描述 |
|---|---|
|
在內存中創建一個寫入緩衝區 將緩衝區包裝在一個 PrintStream對像中將數據寫入控制台 將數組轉換為字符串! 控制台輸出: |
GO TO FULL VERSION