上一篇概述篇說過,一個IO對象是指一個可以被關閉的數據源或者目標,那么StringReader和StringWriter就是一個字符串源和字符串目標。
1. StringtReader:
文檔說:StringReader 是一個數據源為string的字符流。它的實現也非常簡單,內置了一個str字段,在構造函數中初始化這個字段,從ensureOpen方法可以看出,只要構造時的參數不為空,那么代表流已經打開,可以進行后續的讀取操作了。
StringReader重寫了父類的read方法:
從圖中可以看出,StringReader讀取的過程中,實際就是將位置指針標記后移,值得注意的兩點是:
1.1. read方法都進行了同步,因為讀取的過程中進行了指針后移的操作,不同步會導致重復讀取或者跳讀;
1.2. read都是將返回值-1作為流的結尾標志(事實上這也是整個java流家族通用的結束標致);
此外,StringReader還實現了 mark和reset方法,mark即是標記當前指針位置,reset即是將指針重置到標記位置。
2. StringWriter:
StringWriter是將一個StringBuffer對象作為輸出目的地,並且可以在構造函數指定 buffer 的大小。StringWriter只是將數據寫入到一個buffer對象中,而不是實質的物理介質,這個對象最后又可以轉換成字符串(toString)。
StringWriter支持 write和append兩種方法,區別在於,write方法返回空,而append方法返回流對象本身(也就是可以寫成這種格式: append().append())。
其中,write方法參數支持單字符、字符數組、字符串,並且當參數為數組或者字符串時,可以指定范圍(偏移量和取值長度):
append方法支持CharSequence對象和單個字符。
前面說read方法加了同步,為什么write和append卻沒有加呢?其實是因為:write和append方法最后都是調用了StringBuffer.append()方法,而它是同步的。