zoukankan      html  css  js  c++  java
  • JAVA NIO Scatter/Gather(矢量IO)

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

     
     
  • 相关阅读:
    后CIO人如何规划职业生涯
    数据库设计三大范式应用实例剖析
    一个女孩从软件测试工程师到主管的成长
    一本适合测试初学者阅读的中文译著
    再看微软团队文化
    阳光的测试工作历程(转载)
    hdu 2795
    hdu 2426
    hdu 2255+hdu 3395
    hdu 3729
  • 原文地址:https://www.cnblogs.com/niejunlei/p/5996219.html
Copyright © 2011-2022 走看看