Java NIO - Gather

  • 简述

    众所周知,与Java的传统IO API相比,Java NIO是用于数据IO操作的更优化的API.Java NIO提供的另一个附加支持是从/到多个缓冲区读取/写入数据到通道。这种多次读写支持称为“分散和收集”,其中数据在读取数据的情况下从单个通道分散到多个缓冲区,而在写入数据的情况下,数据从多个缓冲区收集到单个通道。
    为了实现这种从通道的多次读取和写入,有散射字节通道和收集字节通道API,Java NIO提供了用于读取和写入数据,如下面的示例所示。
  • GatheringByteChannel

    写入多个通道 − 在此中,我们将来自多个缓冲区的数据写入单个通道。为此,将再次分配多个缓冲区并将其添加到缓冲区类型数组中。然后,此数组作为参数传递给 GatheringByteChannel write() 方法,该方法然后按照缓冲区在数组中出现的顺序从多个缓冲区写入数据。这里要记住的一点是只写入缓冲区的位置和极限之间的数据。
    以下示例显示了如何在 Java NIO 中执行数据收集
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.channels.GatheringByteChannel;
    public class GatherExample {
       private static String FILENAME = "C:/Test/temp.txt";
       public static void main(String[] args) {
          String stream1 = "Gather data stream first";
          String stream2 = "Gather data stream second";
          ByteBuffer bLen1 = ByteBuffer.allocate(1024);
          ByteBuffer bLen2 = ByteBuffer.allocate(1024);
          // Next two buffer hold the data we want to write
          ByteBuffer bstream1 = ByteBuffer.wrap(stream1.getBytes());
          ByteBuffer bstream2 = ByteBuffer.wrap(stream2.getBytes());
          int len1 = stream1.length();
          int len2 = stream2.length();
          // Writing length(data) to the Buffer
          bLen1.asIntBuffer().put(len1);
          bLen2.asIntBuffer().put(len2);
          System.out.println("Gathering : Len1 = " + len1);
          System.out.println("Gathering : Len2 = " + len2);
          // Write data to the file
          try { 
             FileOutputStream out = new FileOutputStream(FILENAME);
             GatheringByteChannel gather = out.getChannel();                             
             gather.write(new ByteBuffer[] {bLen1, bLen2, bstream1, bstream2});
             out.close();
             gather.close();
          }
          catch (FileNotFoundException exObj) {
             exObj.printStackTrace();
          }
          catch(IOException ioObj) {
             ioObj.printStackTrace();
          }
       }
    }
    
  • 输出

    
    Gathering : Len1 = 24
    Gathering : Len2 = 25
    
    最后可以得出结论,Java NIO中的分散/收集方法是在正确使用时作为优化和多任务处理的引入的。它允许您将您读取的数据分离到多个存储桶中,或将不同的数据块组装成一个整体的繁重工作委托给操作系统。毫无疑问,通过避免缓冲区副本,这可以节省时间并更有效地使用操作系统,并减少需要编写和调试的代码量。