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

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐