Java NIO - Raccogli

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.

GatheringByteChannel

write to multiple channels - In questo abbiamo fatto scrivere i dati da più buffer in un unico canale.Per questo ancora più buffer vengono allocati e aggiunti a un array di tipo buffer, quindi questo array viene passato come parametro al metodo write () di GatheringByteChannel che quindi scrive i dati dai buffer multipli nella sequenza i buffer si verificano nell'array. Un punto da ricordare qui è che vengono scritti solo i dati tra la posizione e il limite dei buffer.

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

Produzione

Gathering : Len1 = 24
Gathering : Len2 = 25

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.