2013-02-18 72 views
0

我想使用FilterInputStream類的skip方法,它應該跳過流中所需的字節數。 但對於跳躍方法的文檔說 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)使用FilterInputStream的skip方法

跳過並丟棄n從輸入流中的數據的字節。 由於各種原因,跳過方法可能會跳過一些較小的字節數,可能是0。返回跳過的實際字節數 。

爲了尋求特定的位置,使用skip方法真的很安全嗎?

回答

0

我也發現這個API有點問題。它留下太多的自由的具體實現:

1)目前還不清楚什麼流

2月底的情況下發生的),目前還不清楚是否在流不爲空,一邊喊跳號最終返回一個正數或不。

假設你知道n不是超出流的末尾,並假設(2)成立,則下面的代碼可能會有所幫助:

public static void skipSecure(InputStream is, long n) throws IOException { 
    while (n >= 0) { 
     long skipped = is.skip(n); 
     n -= skipped; 
    } 
} 
+0

也許我們可以用它;但仍建議使用這種方式專業? – agaase 2013-02-19 07:04:12

+0

@ mivaas19:如果您將它用於您瞭解合同的特定InputStream實現,那麼它是安全的。但是,請記住,skip方法僅在流支持有效跳過時有用(例如ByteArrayInputStream,它由內存中的字節數組支持,或者FileInputStream可以跳過磁盤中的扇區)。在其他情況下,您可以使用讀取來實現跳過。 – 2013-02-19 08:35:25

0

FilterInputStream僅僅是底層InputStream的包裝,因此它依賴於底層的InputStream.skip行爲,例如,如果它是我們FileInputSttream應該參考FileInputSttream.skip API它說

skip方法可以是,由於各種原因,最終跳過一些較小的字節數,可能爲0,如果n是否定的,一個IOException即使InputStream超類的skip方法在這種情況下不做任何事情。返回跳過的實際字節數。 此方法可能會跳過比備份文件中剩餘的字節更多的字節。這不會產生異常,並且跳過的字節數可能包括超出備份文件EOF的一些字節數。在跳過結尾後試圖從流中讀取將導致-1指示文件的結尾。

從這個描述FileInputStream.skip對我來說似乎不可靠。