Java NIO中的Buffer類

 

Buffer     緩衝,用於批量讀寫數據spa

 

Buffer是一個抽象類,基本數據類型都有實現類:XxxBuffer,好比ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,最經常使用的是ByteBuffer、CharBuffer。指針

 

Buffer更像一個容器,用於盛裝數據,能夠從數據源讀取數據,放在Buffer裏,也能夠從Buffer中取出數據來用。code

 

 

Buffer中的4個概念:對象

  • capacity     容量,此Buffer的大小
  • limit      界限,limit是一個下標(索引),limit及之後的數據既不能讀,也不能寫
  • position      記錄指針,記錄當前讀寫到的位置
  • mark      標記。讀寫的時候,可在某處作一個標記,調用reset()方法可將記錄指針重置到此mark處。

 

 

 

Buffer使用步驟:blog

(1)建立Buffer對象索引

static  XxxBuffer  allocate(int  capacity)      //靜態方法,返回該類對應的Buffer對象ip

1 //建立一個容量爲10的CharBuffer對象,一次最多可裝10個char
2         CharBuffer charBuffer=CharBuffer.allocate(10);

 

 

(2)往Buffer中放入數據,可以使用put()往Buffer中放入數據,也能夠從Channel中獲取數據。ci

1  //XxxBuffer有多個重載的put()方法,但只能放入該種類型的數據。
2         charBuffer.put(char c);   //未指定index的,都是依次放置。一個蘿蔔一個坑,若是坑中有蘿蔔,就日後放。往坑中放蘿蔔時,記錄指針會指向這個坑,放完後,記錄指針會自動指向下一個坑。
3         charBuffer.put(int index,char c);   //在指定的坑中放蘿蔔
4         charBuffer.put(char[]  src);  //放在多個坑中,一個坑一個char
5         charBuffer.put(String str);  //放在多個坑中,一坑一個char
6         charBuffer.put(CharBuffer src);  //把其餘CharBuffer中的全部蘿蔔都copy一份,放到這個CharBuffer中來,一坑一個char

 

 

(3)數據放置完畢後,調用flip()方法,此方法會將limit設置爲position(記錄指針)的值,並將position(記錄指針)的值置爲0。這就標明瞭可讀寫的數據區間。rem

    說明:數據放置完畢後,position(記錄指針)是指向最後一個蘿蔔後面的那個坑的。get

1 charBuffer.flip();

如今,Buffer作好了輸出數據的準備。

 

 

(4)從Buffer中取出數據,並使用。

1      charBuffer.get();   //取一個蘿蔔。從前日後取,只取一個。
2      charBuffer.get(int index);   //取指定位置上的蘿蔔
3      //這裏的取是指取出副本,並非真的把蘿蔔從坑裏拿出來,蘿蔔仍是在這個坑裏,不會變。

 

 

(5)當Buffer中的數據都用完了,不須要再保存時,就能夠調用clear()清空這個Buffer,這樣,每一個坑都是空的了,又能夠裝入新的數據了。

1      charBuffer.clear();

 

 

 

示例:

 1 //建立Buffer對象
 2         CharBuffer charBuffer=CharBuffer.allocate(10);
 3 
 4         //放入數據
 5         charBuffer.put("ABCD");
 6 
 7         //調整指針,準備好使用數據
 8         charBuffer.flip();
 9 
10         //從Buffer中取出數據來使用
11         System.out.println(charBuffer.get());  //A
12         System.out.println(charBuffer.get(2));  //取第三個,C
13         System.out.println(charBuffer.get());  //B
14 
15         //好啦,這批數據搞定了,再也不用了,清空Buffer,準備好下次裝入數據
16         charBuffer.clear();
17         
18         //裝入下一批數據
19         charBuffer.put('A');
20 
21         //.........

 

觀察上面的輸出結果,調用get()獲取值後,記錄指針會自動指向下一個坑。調用get(int  index)獲取值,記錄指針並不會受到影響,仍是在原來的位置。

 

 

 

Buffer類的其餘經常使用方法:

  • int  capacity()    //返回容量
  • boolean   hasRemaining()    //判斷是否還有元素可供處理(position、limit之間是否還有蘿蔔)
  • int remaining()    //還有多少個元素未處理
  • int  limit()     //返回limit的位置
  • limit(int  newLimit)    //從新設置limit(以新Buffer的形式返回,但原Buffer的limit會改變)
  • int position()   //返回當前記錄指針的位置
  • position(int  newPosition)    //重置position的位置
  • mark()    //在當前position的位置作一個標記
  • reset()   //轉到標記處,即將position指向mark處
  • rewind()   //將position重置爲0,取消設置的mark,即從頭開始。

 

 

 

經過 allocate() 建立的Buffer是普通Buffer。

ByteBuffer提供了 allocateDirect()  來建立直接Buffer,直接Buffer讀取數據的效率很高,但建立成本很高,適合用於建立生存期較長的Buffer。通常狀況用普通Buffer便可。

只有ByteBuffer類能建立直接Buffer。

相關文章
相關標籤/搜索