• [二十]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为标记点
    image_5b9a23fa_9b6

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

    image_5b9a23fa_382f

    其他方法


    StringReader


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

    可以看得出来,底子还是依赖StringBuffer本身
    image_5b9a23fa_1c18

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

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

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

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

    close
    close方法仅仅是置空
    image_5b9a23fa_b5b

    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_5b9a23fa_7b2

    三个版本的append方法
    public StringWriter append(char c)
    public StringWriter append(CharSequence csq)
    public StringWriter append(CharSequence csq, int start, int end)
    这三个方法本身没什么好说的
    需要注意下的就是,它
    内部使用的是write
    image_5b9a23fa_7068



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

    toString
    image_5b9a23fa_61ee


    总结


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

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

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


  • 相关阅读:
    python之字典
    Python包管理工具
    【转】Python实现修改Windows CMD命令行输出颜色(完全解析)
    进程池中传递实例方法问题
    HTML协议详解
    【转】python数据格式化之pprint
    【转】Python装饰器与面向切面编程
    【转】TCP/IP报文格式
    python之线程学习
    python之面向对象
  • 原文地址:https://www.cnblogs.com/noteless/p/9641567.html
Copyright © 2020-2023  润新知