Java PushbackInputStream和标记/重置

Java PushbackInputStream和标记/重置,java,stream,reset,push-back,Java,Stream,Reset,Push Back,我过去常常向前看流中的下一个字节(bufferedIn,它是一个BufferedInputStream),因为我想在某个值之前标记(),然后使用重置()将之前的倒带到它 //将输入流包装到回推流中 PushbackInputStream pbBufferedIn=新的PushbackInputStream(bufferedIn,20); 布尔markDone=false;//以旗换标 布尔值resetDone=false;//重置标志 //读取流中的每个字节(大约两次) for(int i=pb

我过去常常向前看流中的下一个字节(
bufferedIn
,它是一个
BufferedInputStream
),因为我想
在某个值之前标记()
,然后使用
重置()
之前的倒带到它

//将输入流包装到回推流中
PushbackInputStream pbBufferedIn=新的PushbackInputStream(bufferedIn,20);
布尔markDone=false;//以旗换标
布尔值resetDone=false;//重置标志
//读取流中的每个字节(大约两次)
for(int i=pbBufferedIn.read();i!=-1;i=pbBufferedIn.read()){
//转换为字节
字节b=(字节)i;
//在值-1之前检查标记
如果(!markDone){
如果(b==-1){
//推回字符
pbBufferedIn.未读(i);
//标记以便以后回放
pbBufferedIn.标记(20);
markDone=true;
系统输出打印(“[标记]”);
//重读
pbBufferedIn.read();
}
}
//打印当前字节
系统输出打印(b+“”);
//检查值1后的倒带
if(markDone&&!resetDone&&b==1){

pbBufferedIn.reset();//如果您有标记和重置,那么您也不需要回推。

标记/重置在某种程度上等同于回推。
PushbackInputStream
用于输入流不支持缓冲的情况。因此,您可以读取,然后将其回推到流中


使用
BufferedInputStream
您只需
标记(10)
,使用
read(10)
读取10个字节,然后调用
reset()
。现在您的流返回了10个字节,您可以再次读取它,因此您已经有效地选择了它。

BufferedInputStream
(流回放):

  • 现在标记(开始创建缓冲区),以便以后可以在某个缓冲区位置进行回放
  • 您也不能用其他内容替换缓冲的内容
PushbackInputStream
(流纠正重播):

  • 始终有一个可用的缓冲区,您可以将其重置(在某个缓冲区位置)
  • 您可以向该缓冲区提供重播内容
下面,为了简单起见,我提供了长度为1的缓冲区的相应示例:

PushbackInputStream pbis=
新的PushbackInputStream(新的ByteArrayInputStream(新的字节[]{'a','b','c'}));
System.out.println((char)pbis.read());
System.out.println((char)pbis.read());
pbis.unread('x');//读取后返回
System.out.println((char)pbis.read());
System.out.println((char)pbis.read());
BufferedInputStream bis=
新的BufferedInputStream(新的ByteArrayInputStream(新的字节[]{'a','b','c'}));
System.out.println((char)bis.read());
二、标记(1);//阅读前标记
System.out.println((char)bis.read());
bis.reset();//读取后重置
System.out.println((char)bis.read());
System.out.println((char)bis.read());
结果:

a
b
x   //correction
c

a
b
b   //replay
c

我对你的解决方案很感兴趣,如果你有一个解决方案的话。6年后,这个解决方案:)Tks。
a
b
x   //correction
c

a
b
b   //replay
c