Java NIO - Собери
Как мы знаем, Java NIO - это более оптимизированный API для операций ввода-вывода данных по сравнению с обычным API ввода-вывода Java. Еще одна дополнительная поддержка, которую предоставляет Java NIO, - это чтение / запись данных из / в несколько буферов для передачи по каналу. а поддержка записи называется Scatter and Gather, при которой данные распределяются по нескольким буферам из одного канала в случае чтения данных, в то время как данные собираются из нескольких буферов в один канал в случае данных записи.
Чтобы достичь этого множественного чтения и записи из канала, существуют API ScatteringByteChannel и GatheringByteChannel, которые Java NIO предоставляет для чтения и записи данных, как показано в примере ниже.
GatheringByteChannel
write to multiple channels - Здесь мы сделали запись данных из нескольких буферов в один канал. Для этого снова выделяются несколько буферов, которые добавляются в массив типа буфера. Затем этот массив передается в качестве параметра методу GatheringByteChannel write (), который затем записывает данные из нескольких буферов в последовательности, которые буферы встречаются в массиве. Следует помнить, что здесь записываются только данные между положением и пределом буферов.
В следующем примере показано, как сбор данных выполняется в 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();
}
}
}
Вывод
Gathering : Len1 = 24
Gathering : Len2 = 25
Наконец, можно сделать вывод, что подход разброса / сбора в Java NIO представлен как оптимизированный и многозадачный при правильном использовании. Он позволяет делегировать операционной системе рутинную работу по разделению данных, которые вы читаете, на несколько сегментов или сборке. разрозненные фрагменты данных в единое целое. Без сомнения, это экономит время и более эффективно использует операционную систему, избегая копий буфера, а также сокращает объем кода, необходимый для написания и отладки.