NIO基礎

問:什麼是NIO?數組

答:對I/O的byte[]或char[]進行封裝,採用ByteBuffer類來操做數據。簡而言之就是:比I/O更牛逼的知識點;咱們給這個知識點取名爲NIO。spa

問:牛逼在哪?code

答:多了一個緩衝區的概念.這樣對byte[]或char[]這種數組的處理就更靈活了。blog

問:緩衝區怎麼實現的?索引

答:jdk中有一個Buffer抽象類,這個抽象類中有七個實現類,一樣是是抽象類;ci

他們分別是ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.get

這七個抽象類中都有一個靜態的wrap方法,做用是將數組放入緩衝區中,來構建存儲不一樣數據類型的緩衝區。源碼

實例:it

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);

問:Buffer都提供了哪些核心的東西?io

答:Buffer提供了四個字段來操做緩衝區。

capacity:容量

limit:限制

position:位置

mark:標記。

源碼:

問:請介紹capacity?

答:緩衝區的元素數量;應爲數組的元素數量是不能變得,因此capacity也是不能變得。可是能夠用Buffer得capacity()方法獲取元素。

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);
System.out.println("intBuffer="+intBuffer.capacity());

問:請介紹limit?

緩衝區中限制第一個不能讀取或寫入得元素得索引(從0開始);因而可知limit不能爲0,不能大於capacity.

實例:

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);
System.out.println("capacity="+intBuffer.capacity());
System.out.println("默認limit:"+intBuffer.limit());
intBuffer.limit(2);
System.out.println(intBuffer.get(0));
System.out.println(intBuffer.get(1));
System.out.println(intBuffer.get(2));

執行到最後一行會報異常,由於超出了限制範圍。

問:請介紹position?

答:讀取到或者寫入到元素得位置;

int[] intArray={1,2,3,4};
        IntBuffer intBuffer=IntBuffer.wrap(intArray);
        System.out.println("默認位置:"+intBuffer.position());
        intBuffer.position(2);//從2位置開始讀取或寫入
        System.out.println("修改後得位置:"+intBuffer.position());
        intBuffer.put(6);
        System.out.println("添加元素後得位置:"+intBuffer.position());
        for(int i=0;i<intArray.length;i++){
            System.out.print(intArray[i]+" ");
        }

問:market幹什麼得?

答:在market這個動做的時候記錄這個position得值,後面不管position如何變更,只要執行reset()方法,就會把position設置成標記時候得market值。

沒有market得緩衝區,reset()會拋異常。

int[] intArray={1,2,3,4};
        IntBuffer intBuffer=IntBuffer.wrap(intArray);
        intBuffer.position(2);
        intBuffer.mark();
        System.out.println("標記的position:"+intBuffer.position());//2
        intBuffer.position(3);
        System.out.println("變更後得position:"+intBuffer.position());//3
        intBuffer.reset();
        System.out.println("重置以後的position:"+intBuffer.position());//2
相關文章
相關標籤/搜索