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