请选择 进入手机版 | 继续访问电脑版

[IO] JavaIO之StringReader 与 StringWriter (二十一)

编程语言 编程语言 3775 人阅读 | 0 人回复

功能简介

还记得前面说过的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为标记点 image.png

StringWriter内部有两个版本的构造方法 在构造方法内部初始化了内部的buf 创建了一个StringBuffer 一个指定大小 一个不指定 image.png

其他方法

StringReader

read

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

image.png

标记相关

StringReader操作的是内存数据String 所以标记相关的三个方法是轻松支持的 使用mark记录标记点 image.png

ready

常规的ready 只有一个版本构造方法,只要合法构造了 那么数据源String就存在 那么就是可用 image.png

skip

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

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

close

close方法仅仅是置空 image.png

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 方法

比如 image.png

三个版本的append方法

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

这三个方法本身没什么好说的 需要注意下的就是,它内部使用的是write image.png

写入StringBuffer,没什么需要刷新的,不涉及缓存 另外 这个不涉及系统资源,所以关闭一个StringWriter没有什么影响 此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException 而且继续正常使用 要理解本质,人家底层就是一个StringBuffer image.png 关闭后照样可以使用 image.png

toString

image.png

总结

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

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

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

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-157-1-1.html

关注下面的标签,发现更多相似文章

文章被以下专栏收录:

    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or