- Java NIO 教程
- Java NIO - 首頁
- Java NIO - 概述
- Java NIO - 環境設定
- Java NIO vs JAVA IO
- Java NIO - 通道
- Java NIO - 檔案通道
- Java NIO - 資料報通道
- Java NIO - 套接字通道
- Java NIO - 伺服器套接字通道
- Java NIO - 散射
- Java NIO - 聚集
- Java NIO - 緩衝區
- Java NIO - 選擇器
- Java NIO - 管道
- Java NIO - 路徑
- Java NIO - 檔案
- Java NIO - 非同步檔案通道
- Java NIO - 字元集
- Java NIO - 檔案鎖
- Java NIO 有用資源
- Java NIO - 快速指南
- Java NIO - 有用資源
- Java NIO - 討論
Java NIO - 散射
眾所周知,與 Java 的傳統 IO API 相比,Java NIO 是一個更最佳化的資料 IO 操作 API。Java NIO 提供的另一個額外支援是從/向多個緩衝區讀/寫資料到通道。這種多讀寫支援稱為散射和聚集,其中在讀取資料的情況下,資料從單個通道散射到多個緩衝區,而在寫入資料的情況下,資料從多個緩衝區聚集到單個通道。
為了實現從通道進行這種多讀寫,Java NIO 提供了 ScatteringByteChannel 和 GatheringByteChannel API 來讀取和寫入資料,如下例所示。
ScatteringByteChannel
從多個通道讀取 - 在此,我們從單個通道讀取資料到多個緩衝區。為此,分配多個緩衝區並將其新增到緩衝區型別陣列中。然後將此陣列作為引數傳遞給 ScatteringByteChannel read() 方法,該方法隨後按陣列中緩衝區的順序從通道寫入資料。緩衝區滿後,通道繼續填充下一個緩衝區。
以下示例演示瞭如何在 Java NIO 中執行資料的散射。
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();
}
}
}
輸出
Scattering : Len1 = 1214606444 Scattering : Len2 = 0
最後可以得出結論,在正確使用時,Java NIO 中的散射/聚集方法被引入作為一種最佳化和多工方法。它允許您將讀取資料分成多個儲存桶或將分散的資料塊組裝成一個整體的繁重工作委託給作業系統。毫無疑問,這節省了時間,並透過避免緩衝區複製更有效地利用了作業系統,並減少了需要編寫和除錯的程式碼量。
廣告