程序员潇然 发表于 2022-8-26 13:07:58

JavaIO之StringReader 与 StringWriter (二十一)

### 功能简介

还记得前面说过的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为标记点
!(data/attachment/forum/202208/26/130124lbgjb99p4t33qn3o.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

StringWriter内部有两个版本的构造方法
在构造方法内部初始化了内部的buf创建了一个StringBuffer
一个指定大小一个不指定
!(data/attachment/forum/202208/26/130138n246pdnddtzap1a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 其他方法

#### StringReader

#### read

提供了两个版本的read
public int read() throws IOException    读取一个字符
public int read(char cbuf[], int off, int len) throws IOException读取len个数的字符到指定的字符数组cbuf[],保存到指定位置off

!(data/attachment/forum/202208/26/130312p58gfv81lzx81j1j.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### 标记相关

StringReader操作的是内存数据String
所以标记相关的三个方法是轻松支持的
使用mark记录标记点
!(data/attachment/forum/202208/26/130357zl1blbzl1fbb13s5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### ready

常规的ready
只有一个版本构造方法,只要合法构造了
那么数据源String就存在
那么就是可用
!(data/attachment/forum/202208/26/130410jyf1tuhhfh5qg8f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### skip

跳过流中指定数量的字符 返回跳过的字符数

此处 ns 参数可能为负数,虽然 Reader 超类的 skip 方法在此情况下会抛出一个异常
ns 为负值导致此流向后跳读负返回值指示向后跳读   向后跳读不可能倒过字符串的开头
如果读取或跳读了整个字符串,则此方法无效且始终返回 0
了解到他可以为负数,而且返回值也可能是负数

#### close

close方法仅仅是置空
!(data/attachment/forum/202208/26/130431dtjoot0ijqtifqcg.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### StringWriter

write照例提供了 writeappend方法
以及flush 方法 和 close方法
另外
因为内部的StringBuffer 它还提供了一个toString方法

不熟悉StringBuffer的, 可以先过去了解一下StringBuffer

提供了四个版本的write方法

```java
//写入字符数组的某一部分。
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 方法

比如
!(data/attachment/forum/202208/26/130605gen43jszn8zm0eqt.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

三个版本的append方法

```java
public StringWriter append(char c)
public StringWriter append(CharSequence csq)
public StringWriter append(CharSequence csq,int start,int end)
```

这三个方法本身没什么好说的
需要注意下的就是,它内部使用的是write
!(data/attachment/forum/202208/26/130647wayhayhupw3kpumi.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

写入StringBuffer,没什么需要刷新的,不涉及缓存
另外
这个不涉及系统资源,所以关闭一个StringWriter没有什么影响
此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException
而且继续正常使用要理解本质,人家底层就是一个StringBuffer
!(data/attachment/forum/202208/26/130705u88kss6ujs7lnk66.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
关闭后照样可以使用
!(data/attachment/forum/202208/26/130717hqzy4j2x7q1frt3j.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### toString

!(data/attachment/forum/202208/26/130728xv2mdojo6j0t60z8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 总结

StringReader 和StringWriter 本身也没什么特别的,跟CharArrayReader 和 CharArrayWriter 非常的类似
也仅仅是一种数据源的形式而已


只需要记住本文开始说到的原理
String作为数据源
StringReader 是读, 从一个String中读取,所以需要一个String ,通过构造方法传递
StringWriter是写, 写入到一个String中去,所以它内部提供了一个StringBuffer中用来保存数据

以及他们的构造方法即可
其他的方法遵循Reader 或者Writer的家族协议

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-157-1-1.html `
页: [1]
查看完整版本: JavaIO之StringReader 与 StringWriter (二十一)