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()
out
System
PrintStream
PrintStream
在許多 CodeGym 關卡中,幾乎在每個任務中,您都在不知不覺中調用了類的方法!
實際使用
Java 有一個有趣的類ByteArrayOutputStream
,它是一個動態增長的字節數組,它繼承了OutputStream
.
對象ByteArrayOutputStream
和PrintStream
對象可以這樣鏈接:
代碼 | 描述 |
---|---|
|
在內存中創建一個寫入緩衝區 將緩衝區包裝在一個 PrintStream 對像中將數據寫入控制台 將數組轉換為字符串! 控制台輸出:
|