Java NIO - Scatter

Come sappiamo, Java NIO è un'API più ottimizzata per le operazioni di I / O dati rispetto all'API IO convenzionale di Java.Un ulteriore supporto aggiuntivo fornito da Java NIO è la lettura / scrittura di dati da / su più buffer sul canale. e il supporto in scrittura è definito come Scatter and Gather in cui i dati vengono sparsi su più buffer da un singolo canale in caso di dati letti mentre i dati vengono raccolti da più buffer a un singolo canale in caso di dati di scrittura.

Per ottenere questa lettura e scrittura multipla dal canale ci sono ScatteringByteChannel e GatheringByteChannel API che Java NIO fornisce per leggere e scrivere i dati come illustrato nell'esempio seguente.

ScatteringByteChannel

Read from multiple channels - In questo abbiamo fatto di leggere i dati da un singolo canale in più buffer, per questo più buffer vengono allocati e aggiunti a un array di tipo buffer, quindi questo array viene passato come parametro al metodo read () ScatteringByteChannel che quindi scrive i dati da il canale nella sequenza in cui si trovano i buffer nell'array. Una volta che un buffer è pieno, il canale si sposta per riempire il buffer successivo.

L'esempio seguente mostra come viene eseguita la dispersione dei dati in 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();
      }
   }
}

Produzione

Scattering : Len1 = 1214606444
Scattering : Len2 = 0

Infine si può concludere che l'approccio scatter / gather in Java NIO è stato introdotto come ottimizzato e multitasking se usato correttamente, consentendo di delegare al sistema operativo il duro lavoro di separare i dati letti in più bucket o di assemblarli. pezzi disparati di dati in un insieme. Senza dubbio questo fa risparmiare tempo e utilizza il sistema operativo in modo più efficiente evitando le copie del buffer e riduce la quantità di codice necessario per la scrittura e il debug.