1. 程式人生 > >[二十]JavaIO之StringReader 與 StringWriter

[二十]JavaIO之StringReader 與 StringWriter

pad bubuko 過去 標記 下標 通過 cell exce 資源

功能簡介


還記得前面說過的CharArrayReader 和 CharArrayWriter嗎? CharArray 是數據源 CharArrayReader 是讀, 從一個CharArray 中讀取,所以需要一個CharArray,通過構造方法傳遞 CharArrayWriter 是寫, 寫入到一個CharArray中去,所以它內部提供了一個CharArray 用來保存數據
StringReader 和 StringWriter 也是類似的道理 String作為數據源 StringReader 是讀, 從一個String中讀取,所以需要一個String ,通過構造方法傳遞
StringWriter是寫, 寫入到一個String中去,所以它內部提供了一個StringBuffer中用來保存數據

構造方法


StringReader只有一個版本的構造方法,接受一個String作為參數

String str指向這個字符串
length 為字符串長度
next為讀取元素的下標索引
mark為標記點
技術分享圖片

StringWriter內部有兩個版本的構造方法
在構造方法內部初始化了內部的buf 創建了一個StringBuffer
一個指定大小 一個不指定

技術分享圖片

其他方法


StringReader


read方法
提供了兩個版本的read
public int read() throws IOException 讀取一個字符
public int read(char cbuf[], int off, int len) throws IOException 讀取len個數的字符到指定的字符數組cbuf[] ,保存到指定位置off

可以看得出來,底子還是依賴StringBuffer本身
技術分享圖片

標記相關
StringReader操作的是內存數據String
所以標記相關的三個方法是輕松支持的
使用mark記錄標記點
技術分享圖片

ready
常規的ready
只有一個版本構造方法,只要合法構造了
那麽數據源String就存在
那麽就是可用
技術分享圖片

skip
跳過流中指定數量的字符 返回跳過的字符數
此處 ns 參數可能為負數,雖然 Reader 超類的 skip 方法在此情況下會拋出一個異常 ns 為負值導致此流向後跳讀 負返回值指示向後跳讀 向後跳讀不可能倒過字符串的開頭 如果讀取或跳讀了整個字符串,則此方法無效且始終返回 0
了解到他可以為負數,而且返回值也可能是負數

close
close方法僅僅是置空
技術分享圖片

StringWriter


write照例提供了 write append方法 以及flush 方法 和 close方法 另外 因為內部的StringBuffer 它還提供了一個toString方法
不熟悉StringBuffer的, 可以先過去了解一下StringBuffer
提供了四個版本的write方法
void write(char[] cbuf, int off, int len) 寫入字符數組的某一部分。 void write(int c) 寫入單個字符。 void write(String str) 寫入一個字符串。 void write(String str, int off, int len) 寫入字符串的某一部分
既然內不是StringBuffer,自然少不了調用StringBuffer的方法
四個write方法全部都是如此
調用了
StringBuffer的append 方法

比如
技術分享圖片

三個版本的append方法
public StringWriter append(char c)
public StringWriter append(CharSequence csq)
public StringWriter append(CharSequence csq, int start, int end)
這三個方法本身沒什麽好說的
需要註意下的就是,它
內部使用的是write
技術分享圖片



寫入StringBuffer,沒什麽需要刷新的,不涉及緩存
另外
這個不涉及系統資源,所以關閉一個StringWriter沒有什麽影響
此類中的方法在關閉該流後仍可被調用,而不會產生任何 IOException
而且繼續正常使用 要理解本質,人家底層就是一個StringBuffer
技術分享圖片
關閉後照樣可以使用
技術分享圖片

toString 技術分享圖片

總結


StringReader 和StringWriter 本身也沒什麽特別的,跟CharArrayReader 和 CharArrayWriter 非常的類似 也僅僅是一種數據源的形式而已
只需要記住本文開始說到的原理
String作為數據源 StringReader 是讀, 從一個String中讀取,所以需要一個String ,通過構造方法傳遞 StringWriter是寫, 寫入到一個String中去,所以它內部提供了一個StringBuffer中用來保存數據

以及他們的構造方法即可 其他的方法遵循Reader 或者Writer的家族協議

[二十]JavaIO之StringReader 與 StringWriter