Java NIO - Scatter

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.

ScatteringByteChannel

Read from multiple channels - En cela, nous avons fait pour lire les données d'un seul canal dans plusieurs tampons.Pour cela, plusieurs tampons sont alloués et sont ajoutés à un tableau de type tampon.Ensuite, ce tableau est passé en paramètre à la méthode ScatteringByteChannel read () qui écrit ensuite les données à partir de le canal dans la séquence où les tampons se produisent dans le tableau. Une fois qu'un tampon est plein, le canal se déplace pour remplir le tampon suivant.

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

Production

Scattering : Len1 = 1214606444
Scattering : Len2 = 0

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.