功能简介
还记得前面说过的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

标记相关
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的家族协议
转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-157-1-1.html