Учебники

Java NIO — Scatter

Как мы знаем, Java NIO является более оптимизированным API для операций ввода-вывода данных по сравнению с традиционным API ввода-вывода Java. Еще одна дополнительная поддержка, которую обеспечивает Java NIO, заключается в чтении / записи данных из / в несколько буферов в канал. Это многократное чтение и поддержка записи называется Scatter and Gather, в которой данные разбрасываются на несколько буферов из одного канала в случае чтения данных, в то время как данные собираются из нескольких буферов в один канал в случае записи данных.

Для достижения этого множественного чтения и записи из канала есть API ScatteringByteChannel и GatheringByteChannel, который Java NIO предоставляет для чтения и записи данных, как показано в примере ниже.

ScatteringByteChannel

Чтение из нескольких каналов — в этом мы сделали чтение данных из одного канала в несколько буферов. Для этого несколько буферов выделяются и добавляются в массив типа буфера. Затем этот массив передается в качестве параметра методу чтения () ScatteringByteChannel, который затем записывает данные из канала в той последовательности, в которой буферы находятся в массиве. Как только буфер заполнен, канал переходит к заполнению следующего буфера.

В следующем примере показано, как выполняется рассеяние данных в 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 представлен как оптимизированный и многозадачный при правильном использовании. Он позволяет делегировать операционной системе тяжелую работу по разделению прочитанных данных на несколько сегментов или сборке. Несопоставимые фрагменты данных в целом. Несомненно, это экономит время и более эффективно использует операционную систему за счет исключения буферных копий и уменьшения объема кода, необходимого для записи и отладки.