1. 程式人生 > >ByteBuffer中的 clear、flip、rewind三個方法區別、以及如何使用

ByteBuffer中的 clear、flip、rewind三個方法區別、以及如何使用

 

我在網上搜索了很多,大部分都是說針對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;  
                  }  

 

  1.         仔細思考一下: 例如共有100個位元組, ok!那麼知道最後一次向buffer中實際讀取的是10個位元組,如果我在  
  2.                “print(buffer);”之後加入 buffer.flip();程式碼,那麼最後一次buffer的中position僅加了10次。 那如果不加  
  3.         這行程式碼的話,會不會出現我們文章開頭的錯誤呢? 結果是 :“會的”