回滚流——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只能操作文件