Buffer 緩衝,用於批量讀寫數據spa
Buffer是一個抽象類,基本數據類型都有實現類:XxxBuffer,好比ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,最經常使用的是ByteBuffer、CharBuffer。指針
Buffer更像一個容器,用於盛裝數據,能夠從數據源讀取數據,放在Buffer裏,也能夠從Buffer中取出數據來用。code
Buffer中的4個概念:對象
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類的其餘經常使用方法:
經過 allocate() 建立的Buffer是普通Buffer。
ByteBuffer提供了 allocateDirect() 來建立直接Buffer,直接Buffer讀取數據的效率很高,但建立成本很高,適合用於建立生存期較長的Buffer。通常狀況用普通Buffer便可。
只有ByteBuffer類能建立直接Buffer。