posts - 12, comments - 0, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

NIO channel

Posted on 2011-12-19 11:26 cooperzh 阅读(258) 评论(0)  编辑  收藏 所属分类: NIO
channel 用于在 ByteBuffer 和socket(或文件)之间传输数据

channel的实现经常使用操作系统的本地代码

implement InterruptibleChannel 后标示该通道可以被中断,大多数channel都是可以被中断的
面向字节的接口:ReadableByteChannel,WriteableByteChannel
ByteChannel接口继承了ReadableByteChannel和WriteableByteChannel接口

IO广义上可以分为file IO 和 stream IO,对应file通道和socket通道
file通道的类:FileChanel
socket通道的类:SocketChannel,ServerSocketChannel,DatagramChanenel

FileChannel不能直接创建,只能通过打开的RandomAccessFile,FileInputStream,FileOutputStream调用getChannel()获得
socket通道可以直接调用其工厂方法获得实例

只实现ReadableByteChannel或WriteableByteChannel的通道都是单向的,两个都实现就是双向的
实现ByteChannel的通道都是双向的

所有socketChannel类都是双向的

read() 将字节从通道读入缓冲区
write() 将字节从缓冲区写入通道

讲byteBuffer的数据写入通道:
while(buffer.hasRemaining()){
    dest.write(buffer);
}
因为write操作可能会因为其他线程的调用而阻塞

缓冲区可以重复使用,而通道是一次性的,用完就关闭。通道关闭后,代表的与socket的连接会丢失

close方法是阻塞式的,多次close没有坏处。close的实现取决于操作系统。

实现InterruptibleChannel接口的类,如果线程在该通道上被阻塞,同时线程被中断,则通道将会关闭,阻塞线程会报异常:ClosedByInterruptException.

另外,设置了interrupt status的线访问一个通道时,该通道将会立即被关闭,同时抛出ClosedByInterruptException异常
而线程的interrupt status是线程的interrupt()方法设置,并通过Thread.interrupted()清除。

通道上的线程休眠,则通道会关闭

当一个通道被关闭的时候,所有在此通道上休眠的线程都将被唤醒,并收到一个AsynchronousCloseException,接着通道被关闭。

一个通道同时对多个byteBuffer的操作称为分散和聚合
Scatter分散体现在channel.read(ByteBuffer[] dsts) 和 channel.read(ByteBuffer[] dsts,int offset,int length); 
Gather分散体现在channel.write(ByteBuffer[] dsts) 和 channel.write(ByteBuffer[] dsts,int offset,int length);
offset 和 length指的是ByteBuffer[]中第几个ByteBuffer