Guava学习之CharSequenceReader

CharSequenceReader类是以CharSequence的形式读取字符。CharSequenceReader类继承自Reader类,除了remaining()、hasRemaining()以及checkOpen()函数之后,其他的函数都是重写Reader类中的函数。

CharSequenceReader类声明没有用public关键字,所以我们暂时还不能调用这个类

CharSequenceReader类有下面三个成员变量

1
2
3
private CharSequence seq;   //存放字符序列
private int pos;            //存放上述字符序列的下一次读
private int mark;           //可以记录pos的位置,用于下一次重置到pos位置

CharSequenceReader类只有一个构造函数如下:

1
2
3
public CharSequenceReader(CharSequence seq) {
     this.seq = checkNotNull(seq);
}

这个函数非常的简单,就是将seq赋值给CharSequenceReader类的seq,使得其他方法可以操作seq。

01
02
03
04
05
06
07
08
09
10
11
12
13
  private void checkOpen() throws IOException {
      if (seq == null) {
          throw new IOException("reader closed");
      }
  }
 
  private boolean hasRemaining() {
      return remaining() > 0;
  }
 
  private int remaining() {
      return seq.length() - pos;
}

   
   上面三个函数是CharSequenceReader类专有的。checkOpen()函数主要是判断seq是否没有被清空,如果被清空了,抛出空指针异常;否则什么事都不做。其他的函数实现几乎都用到了checkOpen。hasRemaining函数主要是判断当前是否还有数据可以读。在CharSequenceReader类中提供了三个用于读seq中数据的函数,原型如下:

1
2
3
public synchronized int read(CharBuffer target) throws IOException
public synchronized int read() throws IOException
public synchronized int read(char[] cbuf, int off, int len) throws IOException

上述上个函数都是重写自Reader类相关的函数,read(CharBuffer target) 函数实现如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
@Override
public synchronized int read(CharBuffer target) throws IOException {
    checkNotNull(target);
    checkOpen();
    if (!hasRemaining()) {
        return -1;
    }
    int charsToRead = Math.min(target.remaining(), remaining());
    for (int i = 0; i < charsToRead; i++) {
        target.put(seq.charAt(pos++));
    }
    return charsToRead;
}

  先判断seq中是否没被清空;接着判断seq中还有数据可读与否,如果没有数据可读,将返回-1,;否则得到target和seq的最小可读空间大小,并从seq读取相应的数据于target中。其实target.put函数是将一个字符存放在内部char数组的相应位置上面去。read函数最后返回本次读取字符的个数。read()函数实现如下:

1
2
3
文章导航