Java NIO - Topla
Java NIO'nun, Java'nın geleneksel IO API'sine kıyasla veri IO işlemleri için daha optimize bir API olduğunu bildiğimiz için Java NIO'nun sağladığı bir başka ek destek, verileri birden çok arabellekten kanala okumak / yazmaktır. ve yazma desteği, veri yazma durumunda veri birden çok arabellekten tek kanala toplanırken verilerin tek kanaldan birden çok arabelleğe dağıtıldığı Scatter ve Topla olarak adlandırılır.
Kanaldan bu çoklu okuma ve yazma işlemini gerçekleştirmek için, Java NIO'nun aşağıdaki örnekte gösterildiği gibi verileri okumak ve yazmak için sağladığı ScatteringByteChannel ve GatheringByteChannel API vardır.
ToplamaByteChannel
write to multiple channels - Bunun için birden fazla arabellekten tek bir kanala veri yazmayı yaptık.Bunun için yine birden çok arabellek atanır ve bir arabellek türü dizisine eklenir.Daha sonra bu dizi, daha sonra verileri yazan GatheringByteChannel write () yöntemine parametre olarak iletilir Sıradaki çoklu tamponlardan dizide tamponlar oluşur.Burada hatırlanması gereken bir nokta, sadece tamponların konumu ile limiti arasındaki verilerin yazılmasıdır.
Aşağıdaki örnek, Java NIO'da veri toplamanın nasıl gerçekleştirildiğini gösterir.
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();
}
}
}
Çıktı
Gathering : Len1 = 24
Gathering : Len2 = 25
Son olarak, Java NIO'daki dağılım / toplama yaklaşımının, doğru kullanıldığında optimize edilmiş ve çok görevli bir yaklaşım olarak sunulduğu sonucuna varılabilir. Okuduğunuz verileri birden çok kovaya ayırma veya bir araya getirme işini işletim sistemine devretmenize olanak tanır. Şüphesiz bu, arabellek kopyalarından kaçınarak zamandan tasarruf sağlar ve işletim sistemini daha verimli kullanır ve yazma ve hata ayıklama için gereken kod miktarını azaltır.