📅  最后修改于: 2020-11-14 10:14:46             🧑  作者: Mango
在Java中,NIO管道是用于在两个线程之间写入和读取数据的组件。管道主要由两个通道组成,负责数据传播。
在两个组成通道中,一个称为接收器通道,主要用于写入数据,另一个称为源通道,其主要目的是从接收器通道读取数据。
数据同步在数据写入和读取过程中保持顺序,因为必须确保必须按照将数据写入管道的相同顺序读取数据。
必须注意,这是管道中的单向数据流,即,数据仅写入接收器通道,并且只能从源通道读取。
在Java中,NIO管道被定义为抽象类,主要使用三种方法,其中两种是抽象的。
open() -此方法用于获取Pipe的实例,或者可以说通过调用此方法来创建管道。
sink() -此方法返回Pipe的接收器通道,该通道用于通过调用其write方法来写入数据。
source() -此方法返回Pipe的源通道,该通道用于通过调用其read方法来读取数据。
以下示例显示了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 ,其内容如下。该文件将用作示例程序的输入。