PushbackInputStream / PushbackReader它们都提供了如下三个方法
void unread(byte[]/char[] buff):将一个字节/字符数组内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容
void unread(byte[]/char[] buff,int off,int len):将一个字节/字符数组里从off开始,长度为len字节/字符的内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容
void unread(int b):将一个字节/字符推回到推回缓冲区里,从而允许重复读取刚刚读取的内容
- 当这两个推回输入流程序调用unread()方法时,系统将会把指定数组的内容推回到该缓冲区里,而推回输入流每次调用read()方法时总是先从推回缓冲区读取,只有完全读取了推回缓冲区里的内容后,但还没有装满read()所需的数组时才会从原输入流中读取
public static void main(String[] args) {
try {
//创建一个和PushbackReader对象,指定推回缓冲区的长度为64
PushbackReader pushBack = new PushbackReader(new FileReader("D:\\a.txt"),64);
char[] buf = new char[32];
//用以保存上次读取的字符串内容
String lastContent = "";
int hasRead = 0 ;
//循环读取文件内容
while((hasRead = pushBack.read(buf)) > 0) {
//将读取的内容转换为字符串
String content = new String(buf,0,hasRead);
int targetIndex = 0;
//将上次读取的字符串和本次读取的字符串拼起来
//判断是否包含目标字符
if((targetIndex = (lastContent + content).indexOf("new PushBackReader")) > 0) {
//将本次内容和上次内容一起推回缓冲区
pushBack.unread((lastContent + content).toCharArray());
//重新定义一个长度为targetIndex的char数组
if(targetIndex > 32 ) {
buf = new char[targetIndex];
}
//再次读取指定长度的内容(就是目标字符串之间的内容)
pushBack.read(buf, 0, targetIndex);
System.out.println(new String(buf,0,targetIndex));
System.exit(0);
}else {
//打印上次读取的内容
System.out.println(lastContent);
//将本次内容设置为上次读取的内容
lastContent = content;
}
}
} catch (IOException ioe) {
// TODO Auto-generated catch block
ioe.printStackTrace();
}
}```