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