NIO中的重要概念 通道、缓冲区、选择器java
- 通道:相似于流,
- 可是能够异步读写数据(流只能同步读写),
- 通道是双向的,(流是单向的),
- 通道的数据老是要先读到一个buffer 或者 从一个buffer写入,
通道类型: 服务器
- FileChannel:从文件中读写数据。
- FileChannel比较特殊,
- 它能够与通道进行数据交互,
- 不能切换到非阻塞模式,
- DatagramChannel:能经过UDP读写网络中的数据。
- SocketChannel:能经过TCP读写网络中的数据。
- 套接字通道(SocketChannel)能够切换到非阻塞模式;
- ServerSocketChannel:能够监听新进来的TCP链接,像Web服务器那样。
- 对每个新进来的链接都会建立一个SocketChannel。
缓冲区 - 本质上是一块能够存储数据的内存,被封装成了buffer对象而已!网络
缓冲区类型:app
-
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
经常使用方法:异步
-
- allocate() - 分配一块缓冲区
- put() - 向缓冲区写数据
- get() - 向缓冲区读数据
- flip() - 将缓冲区从写模式切换到读模式,limit 指向有效数据末尾
- rewind() - 将缓冲区从写模式切换到读模式,limit 指向capacity
- clear() - 从读模式切换到写模式,不会清空数据,
- 但后续写数据会覆盖原来的数据,
- 即便有部分数据没有读,也会被遗忘;
- compact() - 从读数据切换到写模式,数据不会被清空,
- 会将全部未读的数据copy到缓冲区头部,
- 后续写数据不会覆盖,而是在这些数据以后写数据
- mark() - 对position作出标记,配合reset使用
- reset() - 将position置为标记值
缓冲区的一些属性:socket
- capacity - 缓冲区大小(容量),
- position - 写数据时,position表示当前写的位置,
- 每写一个数据,会向下移动一个数据单元,
- 初始为0;最大为capacity - 1
- 切换到读模式时,position会被置为0,表示当前读的位置
- limit - 写模式下,limit 至关于capacity 表示最多能够写多少数据,
- 切换到读模式时,limit 等于原先的position,表示最多能够读多少数据。
选择器:至关于一个观察者,spa
- 用来监听通道感兴趣的事件,
- 一个选择器能够绑定多个通道;
通道向选择器注册时,须要指定感兴趣的事件,选择器支持如下事件:rest
- SelectionKey.OP_READ表示关注读数据就绪事件
- SelectionKey.OP_WRITE表示关注写数据就绪事件
- SelectionKey.OP_CONNECT表示关注socket channel的链接完成事件
- SelectionKey.OP_ACCEPT表示关注server-socket channel的accept事件
若是你对不止一种事件感兴趣,code
- 那么能够用“位或”操做符将常量链接起来,以下:
- int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;
通道向选择器注册时,会返回一个 SelectionKey对象,具备以下属性server
- interest集合
- ready集合
- Channel
- Selector
- 附加的对象(可选)
用“位与”操做interest 集合和给定的SelectionKey常量,
- 能够肯定某个肯定的事件是否在interest 集合中。
- ready 集合是通道已经准备就绪的操做的集合。
- 在一次选择(Selection)以后,你会首先访问这个ready set。
- 能够这样访问ready集合:
- int readySet = selectionKey.readyOps();
- 四个方法获取已就绪事件,返回值为boolean:
- 能够将一个对象或者更多信息附着到SelectionKey上,
能够经过选择器的select方法获取是否有就绪的通道;
- int select()
- int select(long timeout)
- int selectNow()