Java-nio-scatter

提供:Dev Guides
移動先:案内検索

Java NIO-散布図

Java NIOは、従来のJavaのIO APIと比較して、データIO操作用に最適化されたAPIであることがわかっているため、Java NIOが提供するもう1つの追加サポートは、複数のバッファーからチャネルへのデータの読み取り/書き込みです。書き込みサポートはScatter and Gatherと呼ばれ、データは読み取りデータの場合は単一チャネルから複数のバッファーに分散され、データは書き込みデータの場合は複数のバッファーから単一チャネルに収集されます。

チャネルからのこの複数の読み取りおよび書き込みを実現するために、ScatteringByteChannelおよびGatheringByteChannel APIがあります。JavaNIOは、以下の例に示すように、データの読み取りおよび書き込みを提供します。

ScatteringByteChannel

複数のチャネルからの読み取り-これでは、単一のチャネルから複数のバッファにデータを読み取ります。このため、複数のバッファが割り当てられ、バッファタイプの配列に追加されます。配列内でバッファが発生する順序でチャネルからデータを書き込むメソッド。バッファがいっぱいになると、チャネルは次のバッファを満たすために移動します。

次の例は、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のスキャッター/ギャザーアプローチは、適切に使用すると最適化されたマルチタスクとして導入されたと結論付けることができます。データの塊を全体に分散させることは間違いありません。これにより、バッファコピーを回避することで時間を節約し、オペレーティングシステムをより効率的に使用し、書き込みとデバッグに必要なコードの量を削減できます。