Java NIO - Sammeln

Da wir wissen, dass Java NIO im Vergleich zur herkömmlichen E / A-API von Java eine optimierte API für Daten-E / A-Operationen ist. Eine weitere zusätzliche Unterstützung, die Java NIO bietet, ist das Lesen / Schreiben von Daten aus / in mehrere Puffer in den Kanal Die Schreibunterstützung wird als Scatter and Gather bezeichnet, bei der Daten bei Lesedaten von einem Kanal auf mehrere Puffer gestreut werden, während bei Schreibdaten Daten von mehreren Puffern auf einen einzelnen Kanal gesammelt werden.

Um dieses mehrfache Lesen und Schreiben vom Kanal zu erreichen, gibt es die ScatteringByteChannel- und GatheringByteChannel-API, die Java NIO zum Lesen und Schreiben der Daten bereitstellt, wie im folgenden Beispiel dargestellt.

GatheringByteChannel

write to multiple channels - In diesem Fall haben wir Daten aus mehreren Puffern in einen einzelnen Kanal geschrieben. Dazu werden wiederum mehrere Puffer zugewiesen und einem Puffertyp-Array hinzugefügt. Dann wird dieses Array als Parameter an die Methode GatheringByteChannel write () übergeben, die dann Daten schreibt Aus den mehreren Puffern in der Sequenz treten die Puffer im Array auf. Ein zu beachtender Punkt ist, dass nur die Daten zwischen der Position und der Grenze der Puffer geschrieben werden.

Das folgende Beispiel zeigt, wie die Datenerfassung in Java NIO durchgeführt wird

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();
      }
   }
}

Ausgabe

Gathering : Len1 = 24
Gathering : Len2 = 25

Zuletzt kann gefolgert werden, dass der Scatter / Gather-Ansatz in Java NIO bei ordnungsgemäßer Verwendung als optimierter und Multitasking-Ansatz eingeführt wird. Auf diese Weise können Sie die Grunzarbeit des Aufteilens der gelesenen Daten in mehrere Buckets oder des Zusammenstellens an das Betriebssystem delegieren Zweifellos spart dies Zeit und nutzt das Betriebssystem effizienter, indem Pufferkopien vermieden werden, und reduziert die Menge an Code, die zum Schreiben und Debuggen benötigt wird.