PushbackInputStream and mark/reset



我使用PushbackInputStream来查看流中的下一个字节(bufferedInBufferedInputStream),因为我想在之前的mark() 一些值,然后使用reset()来倒带先前的

// Wrap input stream into a push back stream
PushbackInputStream pbBufferedIn = new PushbackInputStream(bufferedIn, 20);
boolean markDone = false; // Flag for mark
boolean resetDone = false; // Flag for reset
// Read each byte in the stream (some twice)
for (int i = pbBufferedIn.read(); i != -1; i = pbBufferedIn.read()) {
    // Convert to byte
    byte b = (byte) i;
    // Check for marking before value -1
    if (!markDone) {
        if (b == -1) {
            // Push character back
            pbBufferedIn.unread(i);
            // Mark for later rewind
            pbBufferedIn.mark(20);
            markDone = true;
            System.out.print("[mark] ");                    
            // Re-read
            pbBufferedIn.read();
        }
    }
    // Print the current byte
    System.out.print(b + " ");
    // Check for rewind after value 1
    if (markDone && !resetDone && b == 1) {
        pbBufferedIn.reset(); // <------ mark/reset not supported!
        resetDone = true;
        System.out.print("[reset] ");
    }
}

PushbackInputStream不支持mark/reset…另一方面,BufferedInputStream支持标记/复位没有推退机制…我该怎么办?

BufferedInputStream(流回放):

  • 你现在标记(开始创建一个缓冲区),这样你以后可以重放(在某个缓冲区位置)。
  • 也不能用其他内容替换缓冲的内容。

PushbackInputStream (stream corrected-replay):

  • 总是一个可用的缓冲区,你可以重置(在某个缓冲区位置)
  • 您可以提供重放内容到该缓冲区。
为了简单起见,下面我提供了长度为1的相应示例:
PushbackInputStream pbis = 
new PushbackInputStream(new ByteArrayInputStream(new byte[]{'a','b','c'}));
System.out.println((char)pbis.read());
System.out.println((char)pbis.read());
pbis.unread('x'); //pushback after read
System.out.println((char)pbis.read());        
System.out.println((char)pbis.read());        
BufferedInputStream bis = 
new BufferedInputStream(new ByteArrayInputStream(new byte[]{'a','b','c'}));
System.out.println((char)bis.read());
bis.mark(1);//mark before read
System.out.println((char)bis.read());
bis.reset();//reset after read
System.out.println((char)bis.read());        
System.out.println((char)bis.read());
结果:

a
b
x   //correction
c
a
b
b   //replay
c

Mark/reset在某种程度上相当于push - back。PushbackInputStream用于输入流不支持缓冲的情况。所以你读,然后把它推回流。

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

如果你有标记和重置,你也不需要推送。

相关内容

  • 没有找到相关文章

最新更新