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 中的散射/聚集方法被引入作為一種最佳化和多工方法。它允許您將讀取資料分成多個儲存桶或將分散的資料塊組裝成一個整體的繁重工作委託給作業系統。毫無疑問,這節省了時間,並透過避免緩衝區複製更有效地利用了作業系統,並減少了需要編寫和除錯的程式碼量。

廣告

© . All rights reserved.