📜  Java NIO-分散

📅  最后修改于: 2020-11-14 10:13:07             🧑  作者: Mango


众所周知,与Java的常规IO API相比,Java NIO是一种用于数据IO操作的更优化的API.Java NIO提供的另一种支持是从多个缓冲区读取数据/向多个缓冲区写入数据/向通道写入数据。写入支持称为“分散和聚集”,其中在读取数据的情况下,数据从单个通道分散到多个缓冲区,而在写入数据的情况下,数据从多个缓冲区收集到单个通道。

为了实现从通道的多次读写,Java NIO提供了ScatteringByteChannel和GatheringByteChannel API,Java NIO提供了该API来读写数据,如以下示例所示。

ScatteringByteChannel

从多个通道读取-为此,我们将数据从单个通道读取到多个缓冲区中。为此,分配了多个缓冲区并将其添加到缓冲区类型数组中,然后将此数组作为参数传递给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中的分散/收集方法是在正确使用时作为优化和多任务引入的,它允许您将将读取的数据分离到多个存储桶中或组装的繁重工作委托给操作系统。毫无疑问,这避免了缓冲区复制,从而节省了时间并更有效地使用了操作系统,并减少了编写和调试所需的代码量。