Java NIO - Scatter

  • 简述

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

    从多个通道读取 − 在此中,我们制作了将数据从单个通道读取到多个缓冲区中。为此,将分配多个缓冲区并将其添加到缓冲区类型数组中。然后,将此数组作为参数传递给散射字节通道 read() 方法,该方法然后按照缓冲区在数组中出现的顺序从通道写入数据。缓冲区已满后,通道将继续填充下一个缓冲区。
    以下示例显示了如何在 Java NIO 中执行数据分散

    C:/Test/temp.txt

    
    Hello World!
    
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.channels.ScatteringByteChannel;
    public class ScatterExample { 
       private static String FILENAME = "C:/Test/temp.txt";
       public static void main(String[] args) {
          ByteBuffer bLen1 = ByteBuffer.allocate(1024);
          ByteBuffer bLen2 = ByteBuffer.allocate(1024);
          FileInputStream in;
          try {
             in = new FileInputStream(FILENAME);
             ScatteringByteChannel scatter = in.getChannel();
             scatter.read(new ByteBuffer[] {bLen1, bLen2});
             bLen1.position(0);
             bLen2.position(0);
             int len1 = bLen1.asIntBuffer().get();
             int len2 = bLen2.asIntBuffer().get();
             System.out.println("Scattering : Len1 = " + len1);
             System.out.println("Scattering : Len2 = " + len2);
          } 
          catch (FileNotFoundException exObj) {
             exObj.printStackTrace();
          }
          catch (IOException ioObj) {
             ioObj.printStackTrace();
          }
       }
    }
    
  • 输出

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