回滚流(回退流)——PushbackInputStream

回滚流——PushbackInputStream,可以将数据重新推入流中,然后再重新读出。很多人说这个类是为了将不需要的数据重新推入流中,我个人觉得,这样解释并不合理,不需要的数据之间丢掉不就好了嘛!干嘛还要压回去!

个人认为,回滚流主要用于在读取数据时,不确定自己需要读取多少数据时来使用。比如我之前的博客,(H.264视频码流解析)在解析h264文件时确定NAL的位置,NAL 的位置不确定,长度也不确定(3或4个字节),当你取了前三字节发现不是,然后又取第四字节,再将这些数据重新处理成4长度的byte[] ,或者相反就很麻烦,而有了回滚流,我读取三个发现不是,然后退回去,重新读4个,就很方便!

PushbackInputStream类的常用方法

1、public PushbackInputStream(InputStream in) 构造方法 将输入流放入到回退流之中。
2、public int read() throws IOException   普通  读取数据。
3、public int read(byte[] b,int off,int len) throws IOException 普通方法 读取指定范围的数据。
4、public void unread(int b) throws IOException 普通方法 回退一个数据到缓冲区前面。
5、public void unread(byte[] b) throws IOException 普通方法 回退一组数据到缓冲区前面。
6、public void unread(byte[] b,int off,int len) throws IOException 普通方法 回退指定范围的一组数据到缓冲区前面。

 示例:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PushbackInputStream;

public class Tests {
	public static void main(String[] args) throws IOException {
		
		String str = "01asdf001asdfs001as01";//示例文本
		
		//内存流(字节数组流) 不懂可以参考博客https://danddx.blog.csdn.net/article/details/89429886
		ByteArrayInputStream source = new ByteArrayInputStream(str.getBytes());
		
		PushbackInputStream in = new PushbackInputStream(source,30);
		
		/**
		 * 演示目标 输出流中的数字(2-3位)
		 */
		
		byte[] b3 = new byte[3];
		byte[] b2 = new byte[2];
		
		
		int len = 1;
		while(len>0) {
			len = in.read(b2);
			if("01".equals(new String(b2))) {
				b2 = new byte[2]; 
				System.out.println("01");
				continue;
			}
			in.unread(b2);
			len = in.read(b3);
			if("001".equals(new String(b3))) {
				b3 = new byte[3];//刷新缓冲区
				System.out.println("001");
				continue;
			}
			in.unread(b3);
			len = in.read();//丢弃一个字节的数据
		}
		
	}
}

输出结果:

ps:与 PushbackInputStream功能类似的还有任意流(随机流)——RandomAccessFile,与PushbackInputStream不同的是RandomAccessFile只能操作文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dan淡淡的心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值