Java NIO - Streuung
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.
ScatteringByteChannel
Read from multiple channels - In diesem Fall haben wir Daten von einem einzelnen Kanal in mehrere Puffer gelesen. Dazu werden mehrere Puffer zugewiesen und einem Array vom Puffertyp hinzugefügt. Dann wird dieses Array als Parameter an die Methode ScatteringByteChannel read () übergeben, aus der dann Daten geschrieben werden Der Kanal in der Reihenfolge, in der die Puffer im Array auftreten. Sobald ein Puffer voll ist, fährt der Kanal fort, um den nächsten Puffer zu füllen.
Das folgende Beispiel zeigt, wie die Streuung von Daten in Java NIO durchgeführt wird
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();
}
}
}
Ausgabe
Scattering : Len1 = 1214606444
Scattering : Len2 = 0
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.