JAVA IO 包源码剖析(一) StringReader解析

该类为一个字符流,soure是String,即从一个String字符串读取字符。该类继承自Reader.
其实例变量有:
    private String str;   //存储字符串
    private int length;   //存储字符串的长度
    private int next = 0; //存储下一次读取的字符起始位置
    private int mark = 0; //标记字符串位置,该字段用来支持io流的reset操作,即当调用reset方法的时候,从该字段标志的位置开始重新读取

主要方法介绍:
 public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }

read 方法每次从String中读取一个char值,当读取完整个String字符串之后返回-1.

  public int read(char cbuf[], int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return 0;
            }
            if (next >= length)
                return -1;
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }

读取String中的字符到指定数组中。cbuf[]是目的数组,off是目的数组的偏移量,len是最大读取字符数。即如果现有的字符数小于len则,则读取完。函数返回最终的读取数或-1.

*可以看到,当我们写代码的时候应该考虑各种极端的情况,开始时应该考虑极端情况,这样可以避免时间上的浪费。

 public long skip(long ns) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return 0;
            // Bound skip by beginning and end of the source
            long n = Math.min(length - next, ns);
            n = Math.max(-next, n);
            next += n;
            return n;
        }
    }

跳过一定数量的字符,ns表示跳过的字符数,可以为正,也可以为负。为正是表示向前,为负时表示后退,即重新读取。函数返回最终跳过的字符数。
Math.min表示前向对比,Math.max表示向后对比。
  public void mark(int readAheadLimit) throws IOException {
        if (readAheadLimit < 0){
            throw new IllegalArgumentException("Read-ahead limit < 0");
        }
        synchronized (lock) {
            ensureOpen();
            mark = next;
        }
    }

标记现在的位置,支持之后的reset操作。

 public void reset() throws IOException {
        synchronized (lock) {
            ensureOpen();
            next = mark;
        }
    }

将当前位置reset到最近一次mark标记的位置。

  public void close() {
        str = null;
    }

我们熟悉的关闭流操作。直接将资源置空,以前觉得close很神秘,没想到在StringReader就是这么简单的置空。

总结:

StringBuffered应该算是比较简单的IO流操作,其实我本人觉得这个并不像一个io操作,其源端为String,支持mark标记,reset操作,支持跳过字符串向前和向后跳。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值