問:什麼是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