讀取ByteBuffer有效的數據


轉: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM