JavaNIO-パイプ

Javaでは、NIOパイプは、2つのスレッド間でデータを読み書きするために使用されるコンポーネントです。パイプは主に、データの伝播を担当する2つのチャネルで構成されます。

2つの構成チャネルのうち、1つは主にデータの書き込み用のシンクチャネルと呼ばれ、もう1つはシンクチャネルからデータを読み取ることを主な目的とするソースチャネルです。

データがパイプに書き込まれるのと同じ順序で読み取られる必要があるため、データの書き込みと読み取りの間、データの同期は順番に維持されます。

これはパイプ内のデータの一方向フローであることに注意する必要があります。つまり、データはシンクチャネルでのみ書き込まれ、ソースチャネルからのみ読み取ることができます。

Javaでは、NIOパイプは、主に3つのメソッドを持つ抽象クラスとして定義され、そのうち2つは抽象です。

パイプクラスのメソッド

  • open() −このメソッドは、Pipeのインスタンスを取得するために使用されます。または、このメソッドを呼び出すことによってパイプが作成されたと言えます。

  • sink() −このメソッドは、writeメソッドを呼び出してデータを書き込むために使用されるパイプのシンクチャネルを返します。

  • source() −このメソッドは、readメソッドを呼び出してデータを読み取るために使用されるパイプのソースチャネルを返します。

次の例は、JavaNIOパイプの実装を示しています。

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

public class PipeDemo {
   public static void main(String[] args) throws IOException {
      //An instance of Pipe is created
      Pipe pipe = Pipe.open();
      // gets the pipe's sink channel
      Pipe.SinkChannel skChannel = pipe.sink();
      String testData = "Test Data to Check java NIO Channels Pipe.";
      ByteBuffer buffer = ByteBuffer.allocate(512);
      buffer.clear();
      buffer.put(testData.getBytes());
      buffer.flip();
      //write data into sink channel.
      while(buffer.hasRemaining()) {
         skChannel.write(buffer);
      }
      //gets  pipe's source channel
      Pipe.SourceChannel sourceChannel = pipe.source();
      buffer = ByteBuffer.allocate(512);
      //write data into console     
      while(sourceChannel.read(buffer) > 0){
         //limit is set to current position and position is set to zero
         buffer.flip();
         while(buffer.hasRemaining()){
            char ch = (char) buffer.get();
            System.out.print(ch);
         }
         //position is set to zero and limit is set to capacity to clear the buffer.
         buffer.clear();
      }
   }
}

出力

Test Data to Check java NIO Channels Pipe.

テキストファイルがあると仮定します c:/test.txt、次の内容が含まれています。このファイルは、サンプルプログラムの入力として使用されます。