Java NIO (三)-分散(Scatter)/聚集(Gather)

6 篇文章 0 订阅
分散和聚集 I/O 是使用多个(数组)而不是单个缓冲区进行数据读/写; 
分散(Scatter)从通道中读取数据时写入多个缓冲区中,通道将数据“分散”到多个缓冲区中; 

聚集(Gather)写入通道时将多个缓冲区的数据写入同一个通道,通道将多个缓冲区数据“聚集”到一起;


scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。


Scattering Reads 

Scattering Reads是指数据从一个channel读取到多个buffer中。如下图描述: 


注意buffer首先被插入到数组,然后再将数组作为channel.read() 的输入参数。read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。 


支持分散读取的通道需要继承实现ScatteringByteChannel接口:

public interface ScatteringByteChannel extends ReadableByteChannel{
    public long read(ByteBuffer[] dsts, int offset, int length)
        throws IOException;

    public long read(ByteBuffer[] dsts) throws IOException;
}

Gathering Writes 

Gathering Writes是指数据从多个buffer写入到同一个channel。如下图描述:


buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。 

支持聚集写入的通道需要继承实现GatheringByteChannel接口:

public interface GatheringByteChannel  extends WritableByteChannel{
    public long write(ByteBuffer[] srcs, int offset, int length)
        throws IOException;

    public long write(ByteBuffer[] srcs) throws IOException;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值