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 |