根據 Java 官方文檔的描述,mark(int readlimit) 方法表示,標記當前位置,並保證在 mark 之後最多能夠讀取 readlimit 字節數據,mark 標記仍有效。若是在 mark 後讀取超過 readlimit 字節數據,mark 標記就會失效,調用 reset() 方法會有異常。code
但實際的運行狀況卻和 Java 文檔中的描述並不徹底相符。 有時候在 BufferedInputStream 類中調用 mark(int readlimit) 方法後,即便讀取超過 readlimit 字節的數據,mark 標記仍有效,仍然能正確調用 reset 方法重置。文檔
事實上,mark 在 Java 中的實現是和緩衝區相關的。只要緩衝區夠大,mark 後讀取的數據沒有超出緩衝區的大小,mark 標記就不會失效。若是不夠大,mark 後又讀取了大量的數據,致使緩衝區更新,原來標記的位置天然找不到了。源碼
所以,mark 後讀取多少字節才失效,並不徹底由 readlimit 參數肯定,也和 BufferedInputStream 類的緩衝區大小有關。 若是 BufferedInputStream 類的緩衝區大小大於readlimit,在 mark 之後只有讀取超過緩衝區大小的數據,mark 標記纔會失效。it
不懂的看源碼,以 BufferedInputStream 爲例,看下此流類型的兩個成員變量:變量
private static int DEFAULT_BUFFER_SIZE = 8192; private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
因此,通常緩衝區足夠你用了,一般 mark() 後,reset() 不會拋出異常,可是,在未調用 mark() 前,調用 reset() 會拋異常!緣由仍是本身查源碼^_^!方法