[Android Pro] InputStream.skip方法的思考
參考 :?http://blog.csdn.net/gsyzhu/article/details/8102286
在java.io.InputStream類中定義了skip這個方法。在API中的描述如下:
skip
public long skip(long?n)throws IOExceptionThe?skip?method of this class creates a byte array and then repeatedly reads into it until?n?bytes have been read or the end of the stream has been reached. Subclasses are encouraged to provide a more efficient implementation of this method. For instance, the implementation may depend on the ability to seek.
?
翻譯如下:
?skip(long n) throws?IOException
跳過和丟棄此輸入流中數(shù)據(jù)的?n?個字節(jié)。出于各種原因,skip?方法結束時跳過的字節(jié)數(shù)可能小于該數(shù),也可能為?0。導致這種情況的原因很多,跳過?n?個字節(jié)之前已到達文件末尾只是其中一種可能。返回跳過的實際字節(jié)數(shù)。如果?n?為負,則不跳過任何字節(jié)。
此類的?skip?方法創(chuàng)建一個 byte 數(shù)組,然后重復將字節(jié)讀入其中,直到讀夠?n?個字節(jié)或已到達流末尾為止。建議子類提供此方法更為有效的實現(xiàn)。例如,可依賴搜索能力的實現(xiàn)。
| n | 要跳過的字節(jié)數(shù)。 |
| return | 跳過的實際字節(jié)數(shù)。 |
| Throws | IOException:? 如果流不支持搜索,或者發(fā)生其他 I/O 錯誤。 |
?
同時,其子類FileInputStream中也繼承了skip這個方法。如API中所描述的,skip方法會存在跳過的字節(jié)數(shù)小于預期的情況。如果不對返回值進行處理的話,很容易忽視這個問題,導致結果錯誤。最近在看baksmali的源碼,其中有一個簡單而巧妙的方法來避過skip方法的這個弊端。
在分片上傳文件的時候,進行skip,該處理手段非常重要。
FileInputStream in = new FileInputStream(file); int at = offset; while(at > 0) {long realSkip = in.skip(at);if (realSkip == -1) {throw new RuntimeException(file + ": unexpected EOF");}at -= realSkip; }總結
以上是生活随笔為你收集整理的[Android Pro] InputStream.skip方法的思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: seaweedfs 源码笔记(一)
- 下一篇: php中的__autoload()函数