您的位置:首页 > 编程语言 > Java开发

JAVA NIO Scatter/Gather(矢量IO)

2016-10-25 12:06 363 查看
矢量IO=Scatter/Gather:

在多个缓冲区上实现一个简单的IO操作。减少或避免了缓冲区拷贝和系统调用(IO)

write:Gather
数据从几个缓冲区顺序抽取并沿着通道发送,就好比全部缓冲区全部连接起来放入一个大的缓冲区进行发送,缓冲区本身不具备gather能力。
read:Scatter
从通道读取的数据会按顺序散布到多个缓冲区,直到缓冲区被填满或者通道数据读完。





Gather:





Scatter:





示例代码:

/**
* channel Gather/Scatter
*/
public static void channelGatherScatter(){
ByteBuffer head = ByteBuffer.allocate(4);
ByteBuffer body = ByteBuffer.allocate(100);
RandomAccessFile afile = null;
RandomAccessFile bfile = null;
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
try {
afile = new RandomAccessFile("hello.txt", "r");
bfile = new RandomAccessFile("hehe.txt", "rw");
readWriteLock.readLock().lock();
FileChannel fileChannel = afile.getChannel();
ByteBuffer[] buffers = {head, body};
while (fileChannel.read(buffers) != -1){
}
head.flip();
body.flip();
System.out.println(new String(head.array()));
System.out.println(new String(body.array()));
readWriteLock.readLock().unlock();
fileChannel.close();
afile.close();

readWriteLock.writeLock().lock();
FileChannel bfileChannel = bfile.getChannel();

while (bfileChannel.write(buffers) > 0){
}

readWriteLock.writeLock().unlock();
bfileChannel.close();
bfile.close();
}catch (Exception e){
e.printStackTrace();
}
}


带offset、length参数重载read write方法,指明从那个buffer开始,共使用多少个buffer。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: