回滚流(回退流)——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();//丢弃一个字节的数据
		}
		
	}
}

输出结果:

回滚流(回退流)——PushbackInputStream_第1张图片

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

你可能感兴趣的:(java基础,笔记)