NIO

IO NIO
面向流 面向缓冲区
阻塞IO 非阻塞IO
选择器
单向 双向

类比: IO流---》水流
无论 InputStream、OutputStream都是单向的
NIO 通道----》 铁路(本身不能运输),只负责数据的连接
NIO 缓冲区---》 火车(在文件、程序间来回“装卸”),负责数据的存取

Buffer

在NIO中负责数据的存取,缓冲区就是数组,用于存储不同类型的数据,根据数据类型不同(Boolean除外),提供相应类型的缓冲区:

  • byteBuffer
  • charBuffer
  • longBuffer
  • floatBuffer
  • intBuffer
  • shortBuffer
    通过allocate()获取缓冲区。
  • 核心方法 put get flip rewind clear(数据依然存在于缓冲区,但重回被遗忘状态--即所有指针还原到初始位置)

  • 核心属性
    // 位置::表示缓冲区中正在操作数据的位置
    private int position = 0;
    // 界限::表示缓冲区可以操作数据的大小(limit后面的数据不能读写)
    private int limit;
    // 容量::表示缓冲区中最大存储数据的容量::一旦声明不能改变(数组在确定大小之后就不能再改变大小了)
    private int capacity;
    position<=limit<=capacity
    ···

    private static final java.lang.String str = "abcde";
    @Test
    public void test() {
      ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
      // 初始
      System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); // 1024-1024-0
      // 写模式
      byteBuffer.put(str.getBytes());
      System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); // 1024-1024-5
      // 读模式
      Buffer flip = byteBuffer.flip();
      System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); // 5-1024-0
    
      // 相当于从buffer这个“火车”上卸货了
      byte[] dst = new byte[byteBuffer.limit()];
      byteBuffer.get(dst); //读出来的数据放在了 dst 这个字节数组里
      System.out.println(new String(dst, 0, dst.length)); //abcde
      System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); //5-1024-5
    
        // rewind状态,可重复读--position指针又指向了刚flip()的状态
        byteBuffer.rewind();
        System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); //5-1024-0
    
        //清空clear后,缓冲区处于“被遗忘”状态(数据还在,但是capacity\limit\position变成初始状态)
        byteBuffer.clear();
        byte b = byteBuffer.get();
        System.out.println((char)b); //a
        System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" +  byteBuffer.position()); //1024-1024-1
    

    }
    ···


    NIO_第1张图片
    buffer读写模式中属性变化

你可能感兴趣的:(NIO)