推回输入流:
在Java中IO流,读取输入流中的内容,是从头到尾顺序读取的,前面读取过的就不会在读取了,所以如果还想读取前面的数据的话,就要用到推回输入流了。推回输入流提供以下方法:
1. unread(byte[]/char[] buf):将一个字节/字符数组内容推回到推回缓冲区里。允许重复读取
2. unread(byte[]/char[] b.int off,int len): 将一个字节/字符数组内容从off开始,长度为len字节/字符的内容推回缓冲区里
3. unread(int b): 将一个字节/字符推回到推回缓冲区里。
推回输入流中带有一个推回缓存区,当程序调用这两个推回输入流的unread()方法时,系统将会把指定数组的内容推回到推回缓冲区里,然后推回输入流调用read方法时,总是从推回缓冲区读取,只有完全读取了推回缓冲区的内容后,但还没有装满read()所需的数组才会从原输入流中读取。如下图:

下面程序使用推回输入流,并试图找出文件中的“new PushbackReader”字符串,找到后,打印出目标字符之前的内容:
public class IO {
public void pushbackTest(){
try{
File file = new File("./src/main/java/File/IO.java");
//创建一个PushBackReader对象,指定推回缓存区的长度为64
PushbackReader pr = new PushbackReader(new FileReader(file),64);
char[] chars = new char[32];
//用于保存上次读取的字符串内容
String lastContent = "";
int hasRead = 0;
while((hasRead = pr.read(chars)) > 0){
//将读取的内容转换成字符串
String content = new String(chars,0,hasRead);
int targetIndex = 0;
if((targetIndex = (lastContent+content).indexOf("new PushbackReader")) > 0){
//将本次内容和上一次的内容一起推回缓存区
pr.unread((lastContent+content).toCharArray());
//重新定义一个长度为targetIndex的char数组
if(targetIndex > 32){
chars = new char[targetIndex];
}
//再次读取指定长度的内容(就是目标字符串之前的内容)
pr.read(chars,0,targetIndex);
//打印读取的内容
System.out.println(new String(chars,0,targetIndex));
}else{
//打印上次读取的内容
System.out.println(lastContent);
//将本次内容设置成上次内容
lastContent = content;
}
}
}catch(Exception e){}
}
public static void main(String[] args){
IO io = new IO();
io.pushbackTest();
}
}
上述粗体字代码实现了将指定内容推回到推回缓冲区,让程序在调用read方法读取推回缓冲区的内容,从而现实了只打印目标字符串前面的内容功能

本文介绍了如何在Java中使用PushbackReader进行输入流内容的回退操作,展示了如何通过unread方法定位并打印目标字符串前的内容。通过实例演示了如何利用推回缓冲区来实现精确的数据读取控制。
https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0
1549

被折叠的 条评论
为什么被折叠?



