2013-07-29 30 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