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
... ...