JAVA NIO Scatter/Gather(矢量IO)
发布日期:2021-05-09 05:38:08 浏览次数:16 分类:博客文章

本文共 1562 字,大约阅读时间需要 5 分钟。

矢量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。

 
 
上一篇:JAVA NIO FileChannel 内存映射文件
下一篇:JAVA NIO Channel

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月20日 21时20分31秒