Java NIO: dispersión

Como sabemos, Java NIO es una API más optimizada para operaciones de E / S de datos en comparación con la API de E / S convencional de Java. Un soporte adicional más que proporciona Java NIO es leer / escribir datos desde / hacia múltiples búferes al canal. y el soporte de escritura se denomina Scatter and Gather, en el que los datos se dispersan en múltiples búferes de un solo canal en caso de leer datos, mientras que los datos se recopilan de múltiples búferes a un solo canal en caso de escribir datos.

Para lograr esta lectura y escritura múltiples desde el canal, existe la API ScatteringByteChannel y GatheringByteChannel que Java NIO proporciona para leer y escribir los datos como se ilustra en el siguiente ejemplo.

ScatteringByteChannel

Read from multiple channels - En esto hicimos leer datos de un solo canal en múltiples búferes. Para esto, se asignan múltiples búferes y se agregan a una matriz de tipo de búfer. Luego, esta matriz se pasa como parámetro al método read () de ScatteringByteChannel que luego escribe datos desde el canal en la secuencia en que los búferes ocurren en la matriz. Una vez que un búfer está lleno, el canal se mueve para llenar el siguiente búfer.

El siguiente ejemplo muestra cómo se realiza la dispersión de datos en 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();
      }
   }
}

Salida

Scattering : Len1 = 1214606444
Scattering : Len2 = 0

Por último, se puede concluir que el enfoque de dispersión / recopilación en Java NIO se presenta como un método optimizado y multitarea cuando se usa correctamente. Le permite delegar en el sistema operativo el trabajo duro de separar los datos que lee en múltiples cubos o ensamblar fragmentos dispares de datos en un todo. Sin duda, esto ahorra tiempo y usa el sistema operativo de manera más eficiente al evitar copias en búfer y reduce la cantidad de código necesario para escribir y depurar.