Channel 通道

顾名思义,channel在NIO中扮演着通道的角色,负责传输缓冲区Buffer中的数据块。
打个比方,如果说Buffer是码头的话,码头中的一个个集装箱,就是存放在Buffer中的数据块,channel就是航道,运输这些集装箱,就需要走我们的航道,将集装箱送到目的地的码头,具体去哪个码头取集装箱,是由航道决定的,这条航道通往哪里,你就去哪个码头。
所以,我们获取集装箱(数据块)是去找码头(Buffer),找码头(Buffer)之前,我先需要通过航道(Channel)把数据块读入运入(读入)码头。

private ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
.
.
.
channel.read(receiveBuffer);

通过上面这个例子,可以引申出channel的一个特性:
• >对Channel的读写必须通过buffer对象
除此之外
• >Channel是双向的,可以读也可以写
//将缓冲区buffer写入通道

channel.write(sendBuffer);

最后就是,NIO既然是异步非阻塞的,channel自然也具有下面这个特征:
>Channel可以进行异步非阻塞的读写
当然,这一点需要我们手动设置

channel.configureBlocking(false);

有些类型的Channel必须设置成异步非阻塞模式,否则无法进行异步的IO工作,比如SocketChannel和ServerSocketChannel。但也有类型不具备异步,就像FileChannel。
常用的Channel类型有:
• FileChannel:从文件读取数据的
• DatagramChannel:读写UDP网络协议数据
• SocketChannel:读写TCP网络协议数据
• ServerSocketChannel:可以监听TCP连接

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐