美文网首页
javaNio认识与使用

javaNio认识与使用

作者: LinkedIn | 来源:发表于2017-05-26 14:53 被阅读0次

    nio是 java new io 的简写 可以代替原来 io所进行的操作

    old io 是面向流stream的
    new io 是面向 缓冲区的

    认识nio 必须知道几个重点 缓冲区buffer 通道channel

    nio 读取数据到缓冲区的两种模式

    1. 直接缓冲区 ( 通过allocatedircate()取得缓冲区)
    2. 非直接缓冲区( 通过 allocate()取得缓冲区)
      区别:前者尽力不再内存中创建副本,后者才副本中进行实现
    • 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
    • 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

    buffer使用

    认识五大关键 capacity limit position mark reset
    构造数据对象原子数据类型除了boolean以外都是可以的
    bytebuffer,charbuffer,longbuffer''''''''''''''''''''''''''''''''''''''''''

    Paste_Image.png

    bytebuffer.allocate(1024);就会取得五个属性

    初始化position =0 limit=capacity=1024 mark记录当前位置 reset恢复position到mark标记位置
    0<=mark<=positon<=limit<=capacity

    常用方法

    Paste_Image.png

    ···
    String str = "abcde";
    //取得缓冲区
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    System.out.println(buffer.position());
    System.out.println(buffer.limit());
    System.out.println(buffer.capacity());
    System.out.println("--------------put---------------");
    buffer.put(str.getBytes());
    System.out.println(buffer.position());
    System.out.println(buffer.limit());
    System.out.println(buffer.capacity());
    System.out.println("--------------filp读写---------------");
    buffer.flip();
    System.out.println(buffer.position());
    System.out.println(buffer.limit());
    System.out.println(buffer.capacity());
    System.out.println("--------------get---------------");
    byte[] dst=new byte[buffer.limit()];
    buffer.get(dst);//取到了五个数据
    System.out.println(new String(dst, 0, 2));
    System.out.println(buffer.position());
    System.out.println(buffer.limit());
    System.out.println(buffer.capacity());
    System.out.println("--------------reward---------------");
    //重新执行读取,恢复位置
    buffer.rewind();
    System.out.println(buffer.position());
    System.out.println(buffer.limit());
    System.out.println(buffer.capacity());
    System.out.println("--------------mark---------------");
    System.out.println(buffer.mark());
    System.out.println("--------------clear---------------");
    //6. clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态
    buffer.clear();
    System.out.println((char)buffer.get());
    }
    ···

    ···
    String str = "abcde";

        ByteBuffer buf = ByteBuffer.allocate(1024);
    
        buf.put(str.getBytes());
    
        buf.flip();
    
        byte[] dst = new byte[buf.limit()];
        buf.get(dst, 0, 2);
        System.out.println(new String(dst, 0, 2));
        System.out.println(buf.position());
    
        // mark() : 标记
        buf.mark();
    
        buf.get(dst, 2, 2);
        System.out.println(new String(dst, 2, 2));
        System.out.println(buf.position());
    
        // reset() : 恢复到 mark 的位置
        buf.reset();
        System.out.println(buf.position());
    
        // 判断缓冲区中是否还有剩余数据
        if (buf.hasRemaining()) {
    
            // 获取缓冲区中可以操作的数量
            System.out.println(buf.remaining());
        }
    

    ···

    channel 通道

    分散:从buffer读取数据到多个 buffer文件

    聚集:从多个buffer读取数据到channel

    获取channel getchannel()

    filechanel 文件datagramchannel udp serversocketchannel tcp

    socketchannel

    类:
    fileinputstream /fileoutputstream randomaccessfile datagram serversocket
    socket

    jdk 1.7 支持 openchannel() files 下 newbytechannel

    相关文章

      网友评论

          本文标题:javaNio认识与使用

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