NIO堵塞

NIO概述

  • NIO和BIO
    NIO全称为: No Blocking IO,是非阻塞型IO
    BIO全称为:Blocking IO,是阻塞型IO
  • 阻塞IO的弊端
    在等待的过程中,什么事也做不了
  • 非阻塞IO的好处
    不需要一直等待,当一切就绪了再去做

NIO和BIO的区别

  • 区别一
    BIO是堵塞的,NIO是非堵塞的
  • 区别二
    BIO是面向流的,NIO是面向缓冲区的
    BIO中数据传输是单向的,NIO中的缓冲区是双向的

NIO的三大模板

  1. 缓冲区 :用来存储数据
  2. 通道 :用来建立连接和传输数据
  3. 选择器:监视通道的状态

NIO创建缓冲区对象

方法名 说明
static ByteBuffer allocate(长度) 创键byte类型的缓冲区
static ByteBuffer wrap(byte[] array) 创键一个有内容的byte类型缓冲区

NIO缓冲区添加数据

NIO堵塞_第1张图片

public static void main(String[] args) {
        /**
         *        int position()		  当前要操作的索引
         *        int limit() 		  最多能操作到哪个索引
         *        int capacity()		  缓冲区的总长度
         *        remaining()
         *        hasRemaining()
         */
        //创建一个缓冲区长度为50
        ByteBuffer byteBuffer = ByteBuffer.allocate(50);
        System.out.println(byteBuffer.position());//0
        System.out.println(byteBuffer.limit());//10
        System.out.println(byteBuffer.capacity());//10


        //put(byte b)一次添加一个字节,也可以添加一个字节数组
        byteBuffer.put((byte) 97);
        byteBuffer.put("aaa".getBytes());


        /*
          读写位置:表示当前进行读写操作时的位置,初始化为0,即缓冲区开始读或者写数据的位置。可以通过调用ByteBuffer对象的positon(int)方法设置它的值,通过position()可以获取它的值
          position(int newPosition) 修改position
         */
        System.out.println("当前要操作的元素"+byteBuffer.position());
        byteBuffer.position(1);


        //读写限制:最多能操作到哪个元素,也就是缓冲区可以利用范围的最大值,可以调用ByteBuffer对象的limit(int)方法进行设置,调用ByteBuffer对象的limit()获取缓冲区读写限制的大小;在刚开始创建缓冲区的时候limit的大小等于capacity。
        System.out.println("最多能操作到哪个索引"+byteBuffer.limit ());
        
        
        // 即容量,也就是缓冲区的大小。它的值是在创建缓冲区的时候指定的,设定后无法对其进行修改
        System.out.println("缓冲区的总长度"+byteBuffer.capacity ());

        byteBuffer.put("0123456789".getBytes());
        //ByteBuffer.remaining(),此方法最给力,返回剩余的可用长度,此长度为实际读取的数据长度
        System.out.println(byteBuffer.remaining());
        
        
        //hasRemaining()方法用于判断当前位置和限制之间是否有任何元素。
        System.out.println(byteBuffer.hasRemaining());
    }

NIO缓冲区读取数据

方法名 介绍
flip() 切换读写模式
get() 读一个字节
get(byte[] arr) 读多个字节
get(int index) 读指定索引的字节
rewind() 将position设置为0,可以重复读
clean() 数据读写完毕,再次写数据之前,需要调用clear方法
array() 将缓冲区数据转换为字节数组返回
 public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        byteBuffer.put("abc".getBytes());

        //flip()  切换读写模式(写读)
        byteBuffer.flip();
        //get()   读一个字节
        while(byteBuffer.limit() != byteBuffer.position()){
            System.out.println((char) byteBuffer.get());
        }
         public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        byteBuffer.put("abc".getBytes());

        //flip()  切换读写模式(写读)
        byteBuffer.flip();
        //get()   读一个字节
        while(byteBuffer.limit() != byteBuffer.position()){
            System.out.println((char) byteBuffer.get());
        }

        System.out.println ("---------------------");
        //rewind() 将position重置为0,可以重复读
        byteBuffer.rewind();
        for (int i = 0; i < byteBuffer.limit(); i++) {
            System.out.println((char) byteBuffer.get());
        }
        System.out.println ("---------------------");

        //clear()     数据读写完毕(读->写)
        byteBuffer.clear();
        byteBuffer.put("qqq".getBytes());

        //array()     将缓冲区转换成字节数组
        byte[] bytes = byteBuffer.array();
        System.out.println(new String(bytes));
    }

        //clear()     数据读写完毕(读->写)
        byteBuffer.clear();
        byteBuffer.put("qqq".getBytes());

        //array()     将缓冲区转换成字节数组
        byte[] bytes = byteBuffer.array();
        System.out.println(new String(bytes));
    }

你可能感兴趣的:(java网络编程,nio,java)