Java-NIO 入門一

一直對IO、NIO很懵逼,特意在網上又找了一點兒視頻看看,在學習一下,寫下來在鞏固鞏固(手動滑稽)

如有錯誤,請及時聯繫我更正,萬分感謝!

首先看一下使用到是三個屬性

position    當前下標
limit    可用大小
capacity    總大小

使用allocate()創建緩衝區。

先看一下代碼。

public static void test1() {
        /***
         * position 當前位置
         * limit 可使用
         * capacity 總共
         */
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println(byteBuffer.position()); // 0
        System.out.println(byteBuffer.limit()); // 1024
        System.out.println(byteBuffer.capacity()); // 1024
        System.out.println("------------開始存放------------");
        byteBuffer.put("abcdefg".getBytes());
        System.out.println(byteBuffer.position()); // 7
        System.out.println(byteBuffer.limit()); // 1024
        System.out.println(byteBuffer.capacity()); // 1024
        System.out.println("------------開始讀取------------");
        byteBuffer.flip();
        byte[] b = new byte[byteBuffer.limit()];
        byteBuffer.get(b);
        String string = new String(b, 0, b.length);
        System.out.println("讀取到的數據爲:" + string);
        System.out.println(byteBuffer.position()); // 7
        System.out.println(byteBuffer.limit()); // 7
        System.out.println(byteBuffer.capacity()); // 1024
        System.out.println("------------再次讀取------------");
        byteBuffer.rewind();
        byte[] b2 = new byte[byteBuffer.limit()];
        byteBuffer.get(b);
        String s2 = new String(b2, 0, b.length);
        System.out.println("讀取到的數據爲:" + s2);
        System.out.println(byteBuffer.position()); // 7
        System.out.println(byteBuffer.limit()); // 7
        System.out.println(byteBuffer.capacity()); // 1024
        System.out.println("-----------清空緩衝區-------------");
        byteBuffer.clear();
        System.out.println("讀取到的數據爲:" + s2);
        System.out.println(byteBuffer.position()); // 0
        System.out.println(byteBuffer.limit()); // 1024
        System.out.println(byteBuffer.capacity()); // 1024
    }
0
1024
1024
------------開始存放------------
7
1024
1024
------------開始讀取------------
讀取到的數據爲:abcdefg
7
7
1024
------------再次讀取------------
讀取到的數據爲:       
7
7
1024
-----------清空緩衝區-------------
讀取到的數據爲:       
0
1024
1024

看一下對應的結果。當使用allocate()方法創建緩衝區的時候,此時byteBuffer的三個屬性已經確認。

當開始往緩衝區放入數據後,下標(position)會更改,這個時候相當於佔位。

此時可以看到,position已經更改了位置,但是爲什麼limit還是不變呢?是因爲前面的這幾個還是能用的,並不是不能用。

然後使用

byteBuffer.flip();

進行將下標變爲0。使用get()讀取

limit變成了和position一樣,我是這樣理解的。是從之前position加上此次讀取的長度。

而position是和

byte[] b = new byte[byteBuffer.limit()];

裏面的new byte[]裏面的數有關係。

然後使用再次

byteBuffer.rewind();

進行再次讀取,此時也可以使用

byteBuffer.flip();

這兩個方法的區別是flip是從0開始讀取,而rewind是重複上一次讀取的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章