参考文献
深入理解Java NIO
Java NIO?看这一篇就够了!
一、概念
在java1.4中引入了nio类,完整名字为new input output ,是一种非阻塞的io模型。
他的
nio主要由三大块构成,channel通道、buffer缓存区、selector选择区。数据从通道进入缓存区,在缓存区写入;读取则是先读取到缓存区中,然后再通过通道输出。选择区的作用则是监听多个数据通道。
传统的io因为没有缓存区的存在,所以需要每次都完整的读取写入完后在继续下去,所以为阻塞模型,缓存区的存在让模型变为了非阻塞的模型。
选择区的作用是可以在一个在线程中控制多个通道,就像国家电网中的变压器,可以只用一个控制器就对来自不同发电站的电做不同的处理
二、channel通道
通道与流不同的地方在于通道为双向的,而流为单向的。
与通道相连的只能是缓存区,通道的存在使得io可以异步进行无需等待
三、buffer区
buffer的基本使用方法:
- 新建一个buffer,如ByteBuffer.allocate(大小)返回一个Bytebuffer类型的对象
- 写入数据到buffer
- 调用flip()方法切换模式(从读取模式切换为写入模式或者反过来)
- 从buffer中读取数据
- 使用clear()或compact()方法,清空区域
实例:来自于Java NIO系列教程(三) Buffer
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
//获取一个通道
FileChannel inChannel = aFile.getChannel();
//创建一个缓存区
ByteBuffer buf = ByteBuffer.allocate(48);
//写入缓存区
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {//缓存区中存在数据时
buf.flip(); //切换成读取模式
while(buf.hasRemaining()){
System.out.print((char) buf.get()); //一次读取一个byte
}
buf.clear(); //清空
bytesRead = inChannel.read(buf);//继续将通道中的数据写入
}
aFile.close();
四、selector选择区
selector需要和通道配合使用
步骤:来源于Java NIO系列教程(六) Selector
- 创建selector,Selector selector = Selector.open();
- 将通道注册到selector上,注意通道必须处于非阻塞状态,选择区仅支持非阻塞的管道。SelectionKey key = channel.register(selector, Selectionkey.OP_READ);第二个参数为监听的事件类型。
- 返回的key类型的对象可以获取很多东西,如通道、selector等信息。
注册完成后就可以使用selector里面的方法了,如调用select()方法,这个方法会等待到有就绪的注册的事件出现
方法还有selectedkey()方法等。详情看上面的链接。