java 網(wǎng)絡通信 NlO(non-blocking i/o 或者 new i/o) Buffer

  • NIO,異步非阻塞的概念是jdk1.7之后才有的,nio1.0只實現(xiàn)了非阻塞,并沒有實現(xiàn)異步
  • 再談select, iocp, epoll,kqueue及各種I/O復用機制
  • NIO里的三個概念:緩沖區(qū)(buffer),管道(channel),選擇器(selector也叫多路復用器)
  • NIO buffer 使用,buffer 有三個重點屬性,pos(位置),lim(上限),cap(初始化容量)
import java.nio.IntBuffer;

public class TestBuffer {
    
    public static void main(String[] args) {
        
        // 1 基本操作
        //創(chuàng)建指定長度的緩沖區(qū)
        IntBuffer buf = IntBuffer.allocate(10);
        buf.put(13);// position位置:0 - > 1
        buf.put(21);// position位置:1 - > 2
        buf.put(35);// position位置:2 - > 3
        //把位置復位為0,也就是position位置:3 - > 0
        buf.flip();
        System.out.println("使用flip復位:" + buf);
        System.out.println("容量為: " + buf.capacity());   //容量一旦初始化后不允許改變(warp方法包裹數(shù)組除外)
        System.out.println("限制為: " + buf.limit());      //由于只裝載了三個元素,所以可讀取或者操作的元素為3 則limit=3
        
        
        System.out.println("獲取下標為1的元素:" + buf.get(1));
        System.out.println("get(index)方法,position位置不改變:" + buf);
        buf.put(1, 4);
        System.out.println("put(index, change)方法,position位置不變:" + buf);;
        
        for (int i = 0; i < buf.limit(); i++) {
            //調(diào)用get方法會使其緩沖區(qū)位置(position)向后遞增一位
            System.out.print(buf.get() + "\t");
        }
        System.out.println("buf對象遍歷之后為: " + buf);
        /**
         * 總結
         * put(value) 和get() 都會導致position位置向后移一位
         * get(index) 和 put(index,value) 帶下標的方法不會導致position改變
         */

        // 2 wrap方法使用

        //  wrap方法會包裹一個數(shù)組: 一般這種用法不會先初始化緩存對象的長度,因為沒有意義,最后還會被wrap所包裹的數(shù)組覆蓋掉。 
        //  并且wrap方法修改緩沖區(qū)對象的時候,數(shù)組本身也會跟著發(fā)生變化。
        /*
        int[] arr = new int[]{1,2,5};
        IntBuffer buf1 = IntBuffer.wrap(arr);
        System.out.println(buf1);
        
        IntBuffer buf2 = IntBuffer.wrap(arr, 0 , 2);
        //這樣使用表示容量為數(shù)組arr的長度,但是可操作的元素只有實際進入緩存區(qū)的元素長度
        System.out.println(buf2);
        */
        /**
         * 總結
         * wrap 方法包裹數(shù)組時,有些稍微不一樣的地方,就像將值逐個put之后,flip了一樣
         * 包裹數(shù)組之后返回的buffer的三個屬性是這樣的pos=0,lim=arr.length,cap=arr.length
         * 包裹數(shù)組可以添加從哪開始,包裹幾個元素,也就是wrap(arr,offset,length)
         */
        

        // 3 其他方法
        IntBuffer buf1 = IntBuffer.allocate(10);
        int[] arr = new int[]{1,2,5};
        buf1.put(arr);
        System.out.println(buf1);
        //一種復制方法
        IntBuffer buf3 = buf1.duplicate();
        System.out.println(buf3);
        
        //設置buf1的位置屬性
        //buf1.position(0);
        buf1.flip();
        System.out.println(buf1);
        
        System.out.println("可讀數(shù)據(jù)為:" + buf1.remaining());
        
        int[] arr2 = new int[buf1.remaining()];
        //將緩沖區(qū)數(shù)據(jù)放入arr2數(shù)組中去
        buf1.get(arr2);
        for(int i : arr2){
            System.out.print(Integer.toString(i) + ",");
        }

        /**
         * 總結
         * 可以put 數(shù)組,此時buffer的屬性如下
         * pos=arr.length,lim=cap,cap=cap
         * 復制一個buffer可以使用duplicate()方法,
         * pos的位置可以設置
         * 獲取可讀數(shù)據(jù)的方法是remaining(),返回是pos到lim的差值
         * get(arrary) 可以通過array存放buffer里的數(shù)據(jù)
         * position(pos) 方法不建議使用因為你設置的pos可能導致一些無用的數(shù)據(jù)跑出來沒有意義,
         * 使用put(value) 和get()之后記得flip, 應為這倆方法都會導致position位置向后移一位
         */


    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • channel 是雙向的,同時讀取和寫入,流是單向的 channel 和多路復用器結合之后,有多種狀態(tài)位,方便多路...
    MicoCube閱讀 648評論 0 0
  • 作者: 一字馬胡 轉(zhuǎn)載標志 【2017-11-24】 更新日志 一、Java OIO Java OIO (Jav...
    一字馬胡閱讀 1,458評論 0 12
  • 繼上一篇文章《網(wǎng)絡編程之IO與NIO阻塞分析》的講解,已經(jīng)知道了網(wǎng)絡編程的基本方式,今天將繼續(xù)進行網(wǎng)絡編程相關概念...
    landy8530閱讀 1,208評論 0 3
  • IOC是一種可以幫助我們解耦各業(yè)務對象間依賴關系的對象綁定方式。 一、注入方式(通常我們會說IOC是通過DI來實現(xiàn)...
    遠o_O閱讀 257評論 0 0
  • 三面朝陽的屋子,夏日的早上賴床都成了奢望,陽光穿透所有的窗格,刺入眼睛。六點晨起,屋里已擠滿扎眼的光亮,像這樣的日...
    賢兒玥兒閱讀 492評論 5 9

友情鏈接更多精彩內(nèi)容