概述:
Channel(通道)在前面也提到过,是NIO的三大组件之一,相当于BIO中的流,不一样的是,通道是双向的、可异步的、读写必须经过缓冲区的。二流是单向、同步的。
Channel的一些实现:
FileChannel(读写文件)
DatagramChannel(UDP)
SocketChannel(TCP客户端)
ServerSocketChannel(TCP服务器端)
Scatter 分散:
将通道中的数据分散的写入到Buffer中。
![12350543-5501a8a8832f313c.png](https://i-blog.csdnimg.cn/blog_migrate/3729c91b6473d3af5928becdf3fb3e78.png)
Scatter 分散
举个栗子:
消息头、消息体。
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
这会将数据按顺序写入,但是不适合传输动态消息(因为大小不固定)
Gather 聚合:
将多个Buffer读取到一个通道中。
![12350543-7d6667fcd81174e0.png](https://i-blog.csdnimg.cn/blog_migrate/760c0850b6afddd6f409aa04c7c84194.png)
Gather 聚合
举个栗子:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
Gather可以传输动态的消息。
如果两个通道中有一个是FileChannel就可以直接从一个通道传输到另一个通道
通过transferFrom()、transferTo()方法、但是SocketChannel只能传输此刻已经准备好的数据。