📅  最后修改于: 2020-11-14 10:13:29             🧑  作者: Mango
众所周知,与Java的常规IO API相比,Java NIO是一种用于数据IO操作的更优化的API.Java NIO提供的另一种支持是从多个缓冲区读取数据/向多个缓冲区写入数据/向通道写入数据。写入支持称为“分散和聚集”,其中在读取数据的情况下,数据从单个通道分散到多个缓冲区,而在写入数据的情况下,数据从多个缓冲区收集到单个通道。
为了实现从通道的多次读写,Java NIO提供了ScatteringByteChannel和GatheringByteChannel API,Java NIO提供了该API来读写数据,如以下示例所示。
写入多个通道-为此,我们将数据从多个缓冲区写入单个通道中,为此再次分配了多个缓冲区并将其添加到缓冲区类型数组中,然后将此数组作为参数传递给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中的分散/收集方法是在正确使用时作为优化和多任务引入的,它允许您将将读取的数据分离到多个存储桶中或组装的繁重工作委托给操作系统。毫无疑问,这避免了缓冲区复制,从而节省了时间并更有效地使用了操作系统,并减少了编写和调试所需的代码量。