Java-nio-pipe
提供:Dev Guides
Java NIO-パイプ
Java NIOでは、パイプは2つのスレッド間でデータを読み書きするために使用されるコンポーネントです。パイプは、主にデータ伝播を担当する2つのチャネルで構成されます。
2つの構成チャネルのうち、1つは主にデータを書き込むためのシンクチャネルと呼ばれ、もう1つはシンクチャネルからデータを読み取ることを主な目的とするソースチャネルです。
データの書き込みおよび読み取り中は、データがパイプに書き込まれるのと同じ順序でデータを読み取る必要があるため、データの同期は順序どおりに保持されます。
パイプ内のデータの単方向フローであることに注意する必要があります。つまり、データはシンクチャネルのみに書き込まれ、ソースチャネルからのみ読み取ることができます。
Javaでは、NIOパイプは主に3つのメソッドを持つ抽象クラスとして定義され、そのうち2つは抽象です。
Pipeクラスのメソッド
- * open()*-このメソッドはPipeのインスタンスを取得するために使用されるか、このメソッドを呼び出すことでパイプが作成されたと言うことができます。
- * sink()*-このメソッドは、書き込みメソッドを呼び出すことでデータを書き込むために使用されるパイプのシンクチャネルを返します。
- * source()*-このメソッドは、そのreadメソッドを呼び出すことでデータを読み取るために使用されるPipeのソースチャネルを返します。
例
次の例は、Java NIOパイプの実装を示しています。
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*があり、次の内容があるとします。 このファイルは、サンプルプログラムの入力として使用されます。