Java NIO - Rassembler

Comme nous savons que Java NIO est une API plus optimisée pour les opérations d'E / S de données par rapport à l'API IO conventionnelle de Java, une autre prise en charge supplémentaire fournie par Java NIO consiste à lire / écrire des données depuis / vers plusieurs tampons vers le canal. et la prise en charge d'écriture est appelée Scatter and Gather dans laquelle les données sont dispersées vers plusieurs tampons à partir d'un seul canal en cas de lecture de données tandis que les données sont collectées à partir de plusieurs tampons vers un seul canal en cas d'écriture de données.

Afin de réaliser ces multiples lectures et écritures à partir du canal, il existe les API ScatteringByteChannel et GatheringByteChannel que Java NIO fournit pour lire et écrire les données comme illustré dans l'exemple ci-dessous.

GatheringByteChannel

write to multiple channels - En cela, nous avons fait pour écrire des données de plusieurs tampons dans un seul canal.Pour cela, plusieurs tampons sont alloués et ajoutés à un tableau de type tampon.Ensuite, ce tableau est passé en paramètre à la méthode write () de GatheringByteChannel qui écrit ensuite les données à partir des tampons multiples de la séquence, les tampons apparaissent dans le tableau. Un point à retenir ici est que seules les données entre la position et la limite des tampons sont écrites.

L'exemple suivant montre comment la collecte de données est effectuée dans 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();
      }
   }
}

Production

Gathering : Len1 = 24
Gathering : Len2 = 25

Enfin, on peut conclure que l'approche scatter / rassembler dans Java NIO est introduite comme une approche optimisée et multitâche lorsqu'elle est utilisée correctement.Elle vous permet de déléguer au système d'exploitation le travail difficile de séparer les données que vous lisez en plusieurs compartiments, ou d'assembler Il ne fait aucun doute que cela permet de gagner du temps et d'utiliser le système d'exploitation plus efficacement en évitant les copies de mémoire tampon et de réduire la quantité de code nécessaire pour écrire et déboguer.