辛星2018年nio教程第五篇:Scatter与Gather

2018-04-07  本文已影响0人  辛星0913

先打个小广告,关注辛星教程,我的微信号xinxing0913,该项目源码所在的github地址: https://github.com/xinxing0913/xinxing-nio-guide

在nio中,有两个比较重要的概念,分别是Scatter与Gather,Scatter是分散,它可以把Channel中的数据写入到多个Buffer中,而Gather则是聚合,它表示把多个Buffer中的数据写入到同一个Channel中。

在我们经过前面多个范例的实战之后,它并没有什么难度,来看一个具体的代码范例把:

/**
 * 我们这里主要介绍Scatter和Gather
 * Scatter即分散,它是把Channel中的数据写入到多个Buffer中
 * Gather即聚合,它是把多个Buffer中的数据写入到同一个Channel
 */
public class Demo7 {
    public static void main(String[] args) throws Exception {
        Demo7 demo = new Demo7();
        System.out.println("----scatter范例-----");
        demo.scatter();
        System.out.println("----gather范例-----");
        demo.gather();

    }

    public void scatter() throws Exception {
        ByteBuffer buffer1 = ByteBuffer.wrap("hello".getBytes());
        ByteBuffer buffer2 = ByteBuffer.wrap("梦之都".getBytes());

        ByteBuffer[] buffers = {buffer1, buffer2};

        FileChannel channel = new RandomAccessFile("src/main/resources/demo07.txt", "rw").getChannel();
        channel.write(buffers);

        channel.close();
        System.out.println("写入文件操作成功");
    }

    public void gather() throws Exception{
        ByteBuffer buffer1 = ByteBuffer.allocate(5);
        ByteBuffer buffer2 = ByteBuffer.allocate(20);

        ByteBuffer[] buffers = {buffer1, buffer2};

        FileChannel channel = new RandomAccessFile("src/main/resources/demo07.txt", "rw").getChannel();
        channel.read(buffers);

        channel.close();

        System.out.println("buffer1的内容是:" + new String(buffer1.array()));
        System.out.println("buffer2的内容是:" + new String(buffer2.array()));
    }
}

在上面的代码中,并没有什么难以理解的地方,我们来看一下具体的执行效果吧:


image.png

对于Scatter与Gather,我们就介绍到这里啦。

上一篇下一篇

猜你喜欢

热点阅读