敖胤

绳锯木断,水滴石穿;聚沙成塔,集腋成裘。

导航

Java NIO之Scatter(分散)/Gather(聚集)简介

分散读取Scattering Reads是指数据从一个channel读取到多个buffer中,聚集写入Gathering Writes是指数据从多个buffer写入到同一个channel。表现为Channel中如下两个方法:

public final long read(ByteBuffer[] dsts) throws IOException{ ... }
public final long write(ByteBuffer[] srcs) throws IOException{ ... }

scatter / gather经常用于需要将传输的数据分开处理的场合,如网络传输中有时为了方便的处理消息头和消息体,可以将消息体和消息头分散到不同的buffer中。

read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写,Scattering Reads在移动下一个buffer前,必须填满当前的buffer。

write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。

使用示例

try {
    //获取源文件与目标文件
    RandomAccessFile srcFile = new RandomAccessFile("demo.txt", "rw");
    RandomAccessFile dstFile = new RandomAccessFile("demo1.txt", "rw");

    //获取读写通道
    FileChannel readChannel = srcFile.getChannel();
    FileChannel writeChannel = dstFile.getChannel();

    //构建ByteBuffer数组
    ByteBuffer buffer0 = ByteBuffer.allocate(100);
    ByteBuffer buffer1 = ByteBuffer.allocate(1024);

    ByteBuffer[] buffers = {buffer0,buffer1};

    //读取
    readChannel.read(buffers);

    //翻转buffer
    for (ByteBuffer buffer : buffers) {
        buffer.flip();
    }

    //写入
    writeChannel.write(buffers);

} catch (IOException e) {
    e.printStackTrace();
}

posted on 2021-01-19 15:09  敖胤  阅读(123)  评论(0编辑  收藏  举报