Java NIO - Raccogli
Come sappiamo, Java NIO è un'API più ottimizzata per le operazioni di I / O dati rispetto all'API IO convenzionale di Java.Un ulteriore supporto aggiuntivo fornito da Java NIO è la lettura / scrittura di dati da / su più buffer sul canale. e il supporto in scrittura è definito come Scatter and Gather in cui i dati vengono sparsi su più buffer da un singolo canale in caso di dati letti mentre i dati vengono raccolti da più buffer a un singolo canale in caso di dati di scrittura.
Per ottenere questa lettura e scrittura multipla dal canale ci sono ScatteringByteChannel e GatheringByteChannel API che Java NIO fornisce per leggere e scrivere i dati come illustrato nell'esempio seguente.
GatheringByteChannel
write to multiple channels - In questo abbiamo fatto scrivere i dati da più buffer in un unico canale.Per questo ancora più buffer vengono allocati e aggiunti a un array di tipo buffer, quindi questo array viene passato come parametro al metodo write () di GatheringByteChannel che quindi scrive i dati dai buffer multipli nella sequenza i buffer si verificano nell'array. Un punto da ricordare qui è che vengono scritti solo i dati tra la posizione e il limite dei buffer.
Il seguente esempio mostra come viene eseguita la raccolta dei dati in 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();
}
}
}
Produzione
Gathering : Len1 = 24
Gathering : Len2 = 25
Infine si può concludere che l'approccio scatter / gather in Java NIO è stato introdotto come ottimizzato e multitasking se usato correttamente, consentendo di delegare al sistema operativo il duro lavoro di separare i dati letti in più bucket o di assemblarli. pezzi disparati di dati in un insieme. Senza dubbio questo fa risparmiare tempo e utilizza il sistema operativo in modo più efficiente evitando le copie del buffer e riduce la quantità di codice necessario per la scrittura e il debug.