NIO channel

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值