该类为一个字符流,soure是String,即从一个String字符串读取字符。该类继承自Reader.
主要方法介绍:
read 方法每次从String中读取一个char值,当读取完整个String字符串之后返回-1.
读取String中的字符到指定数组中。cbuf[]是目的数组,off是目的数组的偏移量,len是最大读取字符数。即如果现有的字符数小于len则,则读取完。函数返回最终的读取数或-1.
跳过一定数量的字符,ns表示跳过的字符数,可以为正,也可以为负。为正是表示向前,为负时表示后退,即重新读取。函数返回最终跳过的字符数。
标记现在的位置,支持之后的reset操作。
将当前位置reset到最近一次mark标记的位置。
我们熟悉的关闭流操作。直接将资源置空,以前觉得close很神秘,没想到在StringReader就是这么简单的置空。
其实例变量有:
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++);
}
}
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操作,支持跳过字符串向前和向后跳。