管道連接輸入流和輸出流。
管道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()
方法產生數據。無論對管道輸出流寫入什么,可自動使用管道輸入流對象進行讀取。
使用PipedInputStream
的read()
方法從管道讀取數據。如果數據在嘗試從管道讀取時不可用,則管道輸入流被阻止。
管道流具有固定容量的緩沖器,以在寫入管道和從管道讀取之間存儲數據。
當創(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
... ...