nio是 java new io 的简写 可以代替原来 io所进行的操作
old io 是面向流stream的
new io 是面向 缓冲区的
认识nio 必须知道几个重点 缓冲区buffer 通道channel
nio 读取数据到缓冲区的两种模式
- 直接缓冲区 ( 通过allocatedircate()取得缓冲区)
- 非直接缓冲区( 通过 allocate()取得缓冲区)
区别:前者尽力不再内存中创建副本,后者才副本中进行实现
- 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
- 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
buffer使用
认识五大关键 capacity limit position mark reset
构造数据对象原子数据类型除了boolean以外都是可以的
bytebuffer,charbuffer,longbuffer''''''''''''''''''''''''''''''''''''''''''
bytebuffer.allocate(1024);就会取得五个属性
初始化position =0 limit=capacity=1024 mark记录当前位置 reset恢复position到mark标记位置
0<=mark<=positon<=limit<=capacity
常用方法
···
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