三、Channel 通道
Channel 通道顾名思义,channel在NIO中扮演着通道的角色,负责传输缓冲区Buffer中的数据块。打个比方,如果说Buffer是码头的话,码头中的一个个集装箱,就是存放在Buffer中的数据块,channel就是航道,运输这些集装箱,就需要走我们的航道,将集装箱送到目的地的码头,具体去哪个码头取集装箱,是由航道决定的,这条航道通往哪里,你就去哪个码头。所以,我们获取集装箱(数据块)是去
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连接
更多推荐










所有评论(0)