在输入流中,有两个不同的流PushbackInputStream和PushbackReader。被叫做推回输入流,费了好长时间才弄明白是一个怎么回事。简单的理解:输入流,只能读取数据,不能写入数据;输出流,只能写入数据,而不能读取数据。推回流中提供了三个方法void unread(byte[] /char[] buf); void unread(byte[] int off,int len); void unread(int b); 好像改变了这种局面(可以读取输入流中数据,还可以向输入流中插入数据,重新读取数据等)!
也许你可以把一个int数据推回,但是把数组推回输入流报错Exception in thread "main" java.io.IOException: Push back buffer is full
有一句话很重要,当创建PushbackInputStream或PushbackReader对象时,默认推回缓冲区长度为1,当你推回数据大于推回缓冲区大小时会报错。所有你可以显示定义推回缓冲区大小!
例:
import java.io.PushbackReader;
import java.io.StringReader;
public class Demo1 {
public static void main(String[] args) throws Exception {
char[] c = new char[2];
StringReader sr = new StringReader("hello,welcome to china!");
PushbackReader pr = new PushbackReader(sr,4);
/*
* 把“高亮”插入(推回到)输入流开始处。
* 因为推回缓冲区大小为4,“高亮”为两个,被推回的数据小于推回缓冲区大小,所有能够被推回。
* 当把推回缓冲区大小改变成1,将报Push back buffer is full异常。
*/
pr.unread("高亮".toCharArray());
int n=0;
int i=1;
while((n=pr.read(c))!=-1){
String str = new String(c,0,n);
i++;
if(i==6){//把we推回到输入流缓冲区,重新读取
pr.unread(c);
}
System.out.print(str);
}
sr.close();
pr.close();
}
}
注意:我们在上面定义的char[] c 并不是推回流缓冲区大小,创建new PushbackReader(sr,4);对象时的4才是推回流缓冲区大小。