鍍金池/ 教程/ Java/ Java Pipe(管道)
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標準輸入/輸出/錯誤流
Java文件內容和讀寫
Java FilterInputStream示例
Java內存通道
Java路徑
Java令牌和字符串拆分
Java隨機訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java Pipe(管道)

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

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

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

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

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

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

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

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

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

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

當創(chuàng)建管道時,可以設置管道容量。 如果管道的緩沖區(qū)已滿,則嘗試在管道上寫入將會被阻止。
以下代碼創(chuàng)建緩沖區(qū)容量為2048字節(jié)的管道輸入和輸出流。

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