0
点赞
收藏
分享

微信扫一扫

Buffer的分散和聚集


介绍
前面几篇文章有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);
}

}

}


举报

相关推荐

0 条评论