2013-07-29 31 views
0

我完全理解机制标记和重置的工作原理: 但是我想知道为什么从here取下的代码,即使我用br替换br.mark(26) .mark(0)。由于该参数是要在标记之前读取的字符数量。如果我把0作为参数,它不应该读任何东西。相反,它的作用就像我没有改变任何东西。 它为什么会这样?java中的Mark()/ Reset BufferedReader

br = new BufferedReader(isr); 
    // reads and prints BufferedReader 
    System.out.println((char)br.read()); 
    System.out.println((char)br.read()); 
    System.out.println((char)br.read()); 
    // mark invoked at this position 
    br.mark(0); 


    System.out.println("mark() invoked"); 
    System.out.println((char)br.read()); 
    System.out.println((char)br.read()); 
    System.err.println("The Thing to be said:"+(char)br.read()); 

    // reset() repositioned the stream to the mark 
    br.reset(); 
    System.out.println("reset() invoked"); 
    System.out.println((char)br.read()); 
    System.out.println((char)br.read()); 
    System.out.println((char)br.read()); 
+0

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#mark(int) - > *可能*会失败。不能保证它会。虽然我不关心Java的“呃,可能做这个或那个”的事情......这很常见。 –

+0

@BrianRoach流被重置,它是标记之后读取的字符数量,克服了我设置的限制。它应该在我调用mark()时重置缓冲区,然后在下一个read()调用中不返回任何内容。但它失败了,所以它也未能设定字符的限制?那么它的服务是什么? – Rollerball

回答

1

因为它不是一个严格的限制,它只是建议。正如Javadoc:

试图读取字符到这个极限或超出可能失败后到流复位。

(重点煤矿)

+0

流被重置,它是标记之后读取的字符数量超过了设置的限制。它应该在我调用mark()时重置缓冲区,然后在下一个read()调用中不返回任何内容。但它失败了,所以它也未能设定字符的限制?那么它的服务是什么? – Rollerball

+0

@Rollerball - 是的,我明白mark/reset是如何工作的。正如文档所述,它可能会失败。在某些情况下,它会失败,在有些情况下不会。在BufferedReader的情况下,只要您停留在当前缓冲区内,它就不会失败。它只在需要从基础流中加载新缓冲区时才检查预读标志。它的目的是向BufferedReader(或任何其他读取器)建议它需要跟踪多少“旧”数据。 – jtahlborn