轉:https://zhidao.baidu.com/question/427134449349230532.html
說道 ByteBuffer的緩沖區,就需要知道緩沖區的的三個狀態
1)capacity 即容量,也就是緩沖區的大小。它的值是在創建緩沖區的時候指定的,設定后無法對其進行修改。
2)limit 讀寫限制:也就是緩沖區可以利用(進行讀寫)的范圍的最大值,可以調用ByteBuffer對象的limit(int)方法進行設置,
調用ByteBuffer對象的limit()獲取緩沖區讀寫限制的大小;在剛開始創建緩沖區的時候limit的大小等於capacity。
3)position 讀寫位置:表示當前進行讀寫操作時的位置,初始化為0,即緩沖區開始讀或者寫數據的位置。
可以通過調用ByteBuffer對象的positon(int)方法設置它的值,通過position()可以獲取它的值
這三個狀態的數值滿足一下關系:0=<position=<limit=<capacity
在初始化緩沖區的情況下,position=0;limit = capacity
緩沖區是通過put或者putXXX來向緩沖區添加數據,也可以通過put(index,vlaue)方法在指定的position和limit之間指定的地方添加數據;
通過get()或者getXXX()來獲取數據,也可以通過get(int index)方法來獲取position到limit之間指定的數據。
注意position的位置會隨着數據的寫入而移或者讀取一個字節一個字節的移動(比如添加一個byte類型的數據position會+1,
添加一個int類型的數據position會+4;),直到position=limit為止。如果position==limit時,
再添加數據會報java.nio.BufferOverflowException、再獲取數據會報java.lang.IndexOutOfBoundsException。
正因為向緩沖區添加數據的時候寫數據的時候position會變化,如果想獲取緩沖區的數據直接調用get等相關方法獲取數據是肯定不行的,
因為此時數據在緩沖區存在數據的部分是0~~position之間,而讀數據開始的位置position在此區間之外。
所以要獲取此區間的數據需要重新設置position的位置,ByteBuffer提供了一個flip方法,
該方法主要進行兩部操作 limit = position;(將limit設為當前position) position =0;
此時通過get方法就可以獲取到0到limit之間的數據了
以下代碼修改至 http://www.cnblogs.com/guazi/p/6474757.html
public static void main(String[] args) { ByteBuffer buff = ByteBuffer.allocate(1024); String str = "helloWorld"; buff.put(str.getBytes()); System.out.println(new String(buff.array())); System.out.println("position:" + buff.position() + "\t limit:" + buff.limit() + "\t capacity:" + buff.capacity()); // 讀取兩個字節byte[] abytes = new byte[1]; byte[] abytes = new byte[1]; buff.get(abytes); System.out.println("get one byte to string:" + new String(abytes)); // Reads the byte at this buffer's current position, and then increments // the position. buff.get(); System.out.println("獲取兩個字節(兩次get()方法調用)后"); System.out.println("position:" + buff.position() + "\t limit:" + buff.limit()); // Sets this buffer's mark at its position. like // ByteBuffer.this.mark=position buff.mark(); System.out.println("mark()..."); System.out.println("position:" + buff.position() + "\t limit:" + buff.limit()); // 當讀取到碼流后,進行解碼。首先對ByteBuffer進行flip操作, // 它的作用是將緩沖區當前的limit設置為position,position設置為0 // flip方法將Buffer從寫模式切換到讀模式。調用flip()方法會將position設回0,並將limit設置成之前position的值。 buff.flip(); System.out.println("flip()..."); System.out.println("position:" + buff.position() + "\t limit:" + buff.limit() + "\t capacity:" + buff.capacity()); byte[] tbyte = new byte[buff.limit()]; buff.get(tbyte); System.out.println("get one byte to string:" + new String(tbyte)); System.out.println("position:" + buff.position() + "\t limit:" + buff.limit()); if (buff.hasRemaining()) { buff.compact(); } else { buff.clear(); } }
還有幾個關於這個的,感覺寫的還可以:
http://blog.csdn.net/shuaiawp/article/details/51915983
http://www.cnblogs.com/xiaoluo501395377/archive/2012/10/30/2747001.html