Java NIO - Pipe(管道)

  • 简述

    在Java中,NIO管道是一个用于在两个线程之间写入和读取数据的组件。管道主要由两个负责数据传播的通道组成。
    在两个组成信道中,一个称为接收器通道,主要用于写入数据,另一个是源通道,其主要目的是从接收器通道读取数据。
    在数据写入和读取期间,数据同步保持有序,因为必须确保必须以写入管道的相同顺序读取数据。
    它必须注意,它是管道中的单向数据流,即数据仅写入接收器通道,只能从源通道读取。
    在 Java 中,NIO 管道被定义为一个抽象类,主要有三个方法,其中两个是抽象的。
  • 管道类的方法

    • open() − 此方法用于获取 Pipe 的实例,或者我们可以说 pipe 是通过调用此方法创建的。
    • sink() − 此方法返回 Pipe 的接收器通道,该通道用于通过调用其写入方法来写入数据。
    • source() − 此方法返回 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,其中包含以下内容。此文件将用作示例程序的输入。