Java NIO - 管道

在 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 {
        //创建 Pipe 的一个实例
        Pipe pipe = Pipe.open();
        // 获取管道的接收通道
        Pipe.SinkChannel skChannel = pipe.sink();
        String testData = "测试数据以检查 java NIO 通道管道。";
        ByteBuffer buffer = ByteBuffer.allocate(512);
        buffer.clear();
        buffer.put(testData.getBytes());
        buffer.flip();
        //将数据写入接收通道。
        while(buffer.hasRemaining()) {
        skChannel.write(buffer);
        }
        //获取管道的源通道
        Pipe.SourceChannel sourceChannel = pipe.source();
        buffer = ByteBuffer.allocate(512);
        //将数据写入控制台
        while(sourceChannel.read(buffer) > 0){
            //limit 设置为当前位置,position 设置为零
            buffer.flip();
            while(buffer.hasRemaining()){
                char ch = (char) buffer.get();
                System.out.print(ch);
            }
            //position 设置为零,limit 设置为 capacity,以清除缓冲区。
            buffer.clear();
        }
   }
}

输出

测试数据以检查 java NIO 通道管道。

假设我们有一个文本文件 c:/test.txt,其中包含以下内容。此文件将用作示例程序的输入。