零基础java自学流程-Java语言高级500

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

推回输入流:

在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方法读取推回缓冲区的内容,从而现实了只打印目标字符串前面的内容功能


尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值