ByteBuffer中的 clear、flip、rewind三個方法區別、以及如何使用
阿新 • • 發佈:2018-11-19
我在網上搜索了很多,大部分都是說針對mark、limit、capacity、position 標誌量來解釋的,ok!我想補充一下,從如何應用的方面來說明其含義。
例如:
1、有一個檔案共有20個字元:
abcdefghijklmnopqrst
2、我們宣告一個char[15] buffer 大小的字元陣列
Java程式碼
for(readChar(buffer ) != -1) { //將檔案的字元讀入到buffer中,一次最多讀15個 println(toString(buffer)) ;//列印當前結果 } 期望結果:abcdefghijklmnopqrst 實際輸出: abcdefghijklmnopqrst[b]fghijklmnopqrst[/b] ok 這結果顯然是錯誤的: 第一次buffer的結果是: abcdefghijklmno (15個字元) 第二次buffer的結果是 pqrstfghijklmno(前面5個字元是第二次讀取的, 後面的10個字元是第一次讀取的 ) 所以接下倆我們應該改造一下程式碼: int pos; for((pos=readChar(buffer)) != -1) { //將檔案的字元讀入到buffer中,一次最多讀15個 println(toString(buffer, 0, pos)) ;//列印當前結果 } 期望結果:abcdefghijklmnopqrst 實際輸出: abcdefghijklmnopqrst 很顯然這次是正確的。 ok,那我們從這個角度是思考ByteBuffer,我們同樣需要ByteBuffer物件中的標誌符去控制類似的情況 ByteBuffer buffer = ByteBuffer.alloate(20); while(read(buffer ) > 0) { //每次寫一個值,position都會加1 //讀值時,我們當然要從起始開始位置讀了,所以執行,讀到limit位置結束 buffer.rewind(); print(buffer); //那flip、clear,什麼時候執行呢,其中clear方法,是將ByteBuffer標識重置為初始狀態,ok那我們來說說flip 我對flip的理解是 提高效率。 首先看一下flip程式碼: public final Buffer flip() { limit = position; position = 0; mark = -1; return this; }
- 仔細思考一下: 例如共有100個位元組, ok!那麼知道最後一次向buffer中實際讀取的是10個位元組,如果我在
- “print(buffer);”之後加入 buffer.flip();程式碼,那麼最後一次buffer的中position僅加了10次。 那如果不加
- 這行程式碼的話,會不會出現我們文章開頭的錯誤呢? 結果是 :“會的”