Java Pipe(管道)

管道連接輸入流和輸出流。

管道I/O基於生產者 - 消費者模式,其中生產者產生數據,而消費者消費數據。在管道I/O中,創建兩個流代表管道的兩端。 PipedOutputStream對象表示流的一端,PipedInputStream對象則表示流的另一端。使用兩個對象的connect()方法連接兩端。

還可以通過在創建另一個對象時將一個對象傳遞給構造函數來連接它們。以下代碼顯示了創建和連接管道兩端的兩種方法:

第一種方法創建管道輸入和輸出流並連接它們。 它使用connect()方法連接兩個流。

PipedInputStream pis  = new PipedInputStream(); 
PipedOutputStream pos  = new PipedOutputStream(); 
pis.connect(pos); /* Connect  the   two  ends  */

第二種方法創建管道輸入和輸出流並連接它們。 它通過將輸入管道流傳遞到輸出流構造器來連接兩個流。

PipedInputStream pis  = new PipedInputStream(); 
PipedOutputStream pos  = new PipedOutputStream(pis);

可以在連接管道的兩端後生成和使用數據。通過使用PipedOutputStream對象的write()方法產生數據。無論對管道輸出流寫入什麼,可自動使用管道輸入流對象進行讀取。

使用PipedInputStreamread()方法從管道讀取數據。如果數據在嘗試從管道讀取時不可用,則管道輸入流被阻止。

管道流具有固定容量的緩衝器,以在寫入管道和從管道讀取之間存儲數據。

當創建管道時,可以設置管道容量。 如果管道的緩衝區已滿,則嘗試在管道上寫入將會被阻止。
以下代碼創建緩衝區容量爲2048字節的管道輸入和輸出流。

PipedOutputStream pos  = new PipedOutputStream(); 
PipedInputStream pis  = new PipedInputStream(pos, 2048);

管道用於將數據從一個線程傳輸到另一個線程。兩個線程之間的同步由阻塞讀和寫來處理。

示例

以下代碼演示如何使用管道I/O

import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Main {
  public static void main(String[] args) throws Exception {
    PipedInputStream pis = new PipedInputStream();
    PipedOutputStream pos = new PipedOutputStream();
    pos.connect(pis);

    Runnable producer = () -> produceData(pos);
    Runnable consumer = () -> consumeData(pis);
    new Thread(producer).start();
    new Thread(consumer).start();
  }

  public static void produceData(PipedOutputStream pos) {
    try {
      for (int i = 1; i <= 50; i++) {
        pos.write((byte) i);
        pos.flush();
        System.out.println("Writing: " + i);
        Thread.sleep(500);
      }
      pos.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static void consumeData(PipedInputStream pis) {
    try {
      int num = -1;
      while ((num = pis.read()) != -1) {
        System.out.println("Reading: " + num);
      }
      pis.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

  }
}

上面的代碼生成以下結果。

Reading: 1
Writing: 1
Writing: 2
Reading: 2
Reading: 3
Writing: 3
Writing: 4
Reading: 4
Writing: 5
Reading: 5
Writing: 6
Reading: 6
Reading: 7
Writing: 7
Writing: 8
Reading: 8
Reading: 9
Writing: 9
Writing: 10
Reading: 10
Writing: 11
Reading: 11
Writing: 12
... ...