简谈PushbackInputStream流

PushbackInputStream是Java中一种可以回退的装饰流,允许将已读取的数据放回缓冲区。文章通过代码示例展示了如何使用其默认构造函数和自定义缓冲区大小的构造函数进行回退操作,并强调了回退字节数超过缓冲区大小时可能引发的异常。了解此类流的基本用法对于处理特定输入流场景有所帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下继承关系和方法:
在这里插入图片描述
也是一种装饰流,需要传入一个InputStream类型的对象!


先说一下,这个可以回退的流:

比如:

... D C B A -> | 从 A 开始读取,把A取出来之后,就不想取出来了,再放回去!哈哈,不可思议,unbelievable哈。

其实,PushbackInputStream是把A又放回了缓冲区里了。

再读的时候,从缓冲区里读,读到的又是A

代码:演示一哈:

public class BufferedReaderTestClient {
    public static void main(String[] args) {
        try (PushbackInputStream inputStream = new PushbackInputStream(new FileInputStream("Test"))) {
            int data = inputStream.read();
            inputStream.unread(data);
            System.out.println("data = " + data);
            data = inputStream.read();
            System.out.println("data = " + data);
        } catch (Exception exception) {
        }
    }
}

这里,我们用的是第一种构造函数:

    public PushbackInputStream(InputStream in) {
        this(in, 1);
    }

缓冲区是1.

    public PushbackInputStream(InputStream in, int size) {
        super(in);
        if (size <= 0) {
            throw new IllegalArgumentException("size <= 0");
        }
        this.buf = new byte[size];
        this.pos = size;
    }

可以看出,用一个参数的构造函数,int size默认大小就是1.

因此,再代码里的int data = inputStream.read()是读取了一个字节,inputStream.unread(data)又把读取的字节放回了缓冲区里,data = inputStream.read()再次去读时,是从缓冲区里读取的,所以2次的data是一样的。

如果,想回退两个字节呢?

inputStream.unread(data);操作执行2次,因为缓冲区默认是1,操作执行2次缓冲区会溢出,就会抛出异常!

如果,不想抛出异常,就要用第二种构造器:

public class BufferedReaderTestClient {
    public static void main(String[] args) {
        try (PushbackInputStream inputStream = new PushbackInputStream(new FileInputStream("Test"), 4)) {
            int data = inputStream.read();
            inputStream.unread(data);
            inputStream.unread(data);
            System.out.println("data = " + data);
            data = inputStream.read();
            System.out.println("data = " + data);
            data = inputStream.read();
            System.out.println("data = " + data);
        } catch (Exception exception) {
        }
    }
}

这个时候,缓冲区设置成了4个字节,就可以回退多个了,但是不能超过,构造参数指定的参数的大小(4个)!

这种流,了解一下即可!(个人认为,用到了再深入研究)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值