关于InputStream.mark()问题
InputStream - mark/reset 操作不是每個 input stream 都有支援,我想你明白這一點,所以選了
java.io.BufferedInputStream 來作測試。
BufferedInputStream 顧名思義就是有 buffering 機制的 input stream。它內部使用的 buffer size 可以在
建構 BufferedInputStream 時指定,預設值是 8k。
BufferedInputStream 內部因為有使用 buffer 來 preload data,直覺上這個 buffer 的 size 影響
mark/reset 所能支援的 marklimit。從你測試的結果來看,像是只要從 mark position 後所 consumed data
size 不大於 BufferedInputStream buffer size 的情況下,都能夠正確 reset(對於 InputStream - mark 原始
contract 來說是 overqualified),等於是充分利用內部的 buffer。
不過稍微看一下 sun 提供的 BufferedInputStream source code,BufferedInputStream 有 markpos,
marklimit 等 field,以此來推論應該是 honor mark/reset 機制,至於為什麼會有 overqualified 表現,要仔
細 trace 原始碼。(這種 consume 超過 marklimit 量的 data 後還能正確 reset 回 mark position,我個人是
不認為違反 mark/reset contract,所以我用 overqualified 來形容)