javaNio认识与使用

2017-05-26  本文已影响0人  LinkedIn

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

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

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

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

  1. 直接缓冲区 ( 通过allocatedircate()取得缓冲区)
  2. 非直接缓冲区( 通过 allocate()取得缓冲区)
    区别:前者尽力不再内存中创建副本,后者才副本中进行实现

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

上一篇下一篇

猜你喜欢

热点阅读