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);
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值