NIO

作者: 胡小禾 | 来源:发表于2018-01-17 00:11 被阅读0次
    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
      

      }
      ···


      buffer读写模式中属性变化

    相关文章

      网友评论

          本文标题:NIO

          本文链接:https://www.haomeiwen.com/subject/altyoxtx.html