介绍
前面几篇文章有Buffer的读写,都是通过一个个Buffer来完成的,NIO还支持通过多个Buffer(即Buffer数组)完成读写操作,即Scattering和Gathering来完成Buffer的分散和聚集
核心
/核心 我们可以建立一个ByteBuffer数组 数组中存放buffer,当我们写入数据时第一个写满了可以将剩余的数据存放到ByteBuffer数组中的下一个,读取的时候也可以依次读ByteBuffer数组中的Buffer
ByteBuffer[] buffer = new ByteBuffer[2];
buffer[0] = ByteBuffer.allocate(5);
buffer[1] = ByteBuffer.allocate(3);
实例代码
/**
* @author TAO
* @description: Buffer的分散和聚集
* Scattering 将数据写入到buffer时,可以采用buffer数组,依次写入[分散]
* Gathering 从buffer读取数据时,可以采用buffer数组一次读
* 优点,在我们在读写Buffer的时候一个Buffer不够用,那么这时我们可以整成一个数组的形式
* @date 2021/6/23 2:23
*/
public class ScatterAndGather {
public static void main(String[] args) throws IOException {
//使用serverSocketChannel 和 SocketChannel网络
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
InetSocketAddress inetSocketAddress = new InetSocketAddress(7000);
//绑定端口连接telnet
serverSocketChannel.socket().bind(inetSocketAddress);
//核心 我们可以建立一个ByteBuffer数组 数组中存放buffer
//当我们写入数据时第一个写满了可以将剩余的数据存放到ByteBuffer数组中的下一个
//读取的时候也可以依次读ByteBuffer数组中的Buffer
ByteBuffer[] buffer = new ByteBuffer[2];
buffer[0] = ByteBuffer.allocate(5);
buffer[1] = ByteBuffer.allocate(3);
//等待客户端连接
SocketChannel socketChannel = serverSocketChannel.accept();
int messageLength = 8;
while (true) {
int byteRead = 0;
while (byteRead < messageLength) {
long l = socketChannel.read(buffer);
System.out.println("byteRead=" + byteRead);
Arrays.asList(buffer).stream().map(byteBuffer -> "postion=" + byteBuffer.position() + ", limit=" + byteBuffer.limit()).forEach(System.out::println);
}
Arrays.asList(buffer).forEach(byteBuffer -> byteBuffer.flip());
long byteWirte = 0;
while (byteWirte < messageLength) {
long l = socketChannel.write(buffer);
byteWirte += 0;
}
Arrays.asList(buffer).forEach(byteBuffer -> byteBuffer.clear());
System.out.println("byteRead:=" + byteRead + "byteWrite=" + byteWirte + "messageLength=" + messageLength);
}
}
}