W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
管道連接輸入流和輸出流。
管道 I/O基于生產(chǎn)者 - 消費者模式,其中生產(chǎn)者產(chǎn)生數(shù)據(jù)并且消費者消費數(shù)據(jù)。
在管道 I/O中,我們創(chuàng)建兩個流代表管道的兩端。 PipedOutputStream對象表示一端,PipedInputStream對象表示另一端。我們使用兩個對象上的connect()方法連接兩端。
我們還可以通過在創(chuàng)建另一個對象時將一個對象傳遞給構(gòu)造函數(shù)來連接它們。
以下代碼顯示了創(chuàng)建和連接管道兩端的兩種方法:
第一種方法創(chuàng)建管道輸入和輸出流并連接它們。它使用connect方法連接兩個流。
PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(); pis.connect(pos); /* Connect the two ends */
第二種方法創(chuàng)建管道輸入和輸出流并連接它們。它通過將輸入管道流傳遞到輸出流構(gòu)造器來連接兩個流。
PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis);
我們可以在連接管道的兩端后生成和使用數(shù)據(jù)。
我們通過使用PipedOutputStream對象的一個??write()方法產(chǎn)生數(shù)據(jù)。無論我們對管道輸出流寫入什么,自動變得可用于管道輸入流對象進行讀取。
我們使用PipedInputStream的read()方法從管道讀取數(shù)據(jù)。如果數(shù)據(jù)在嘗試從管道讀取時不可用,則管道輸入流被阻止。
管道流具有固定容量的緩沖器,以在寫入管道和從管道讀取之間存儲數(shù)據(jù)。
我們可以設(shè)置管道容量,當(dāng)我們創(chuàng)建它。如果管道的緩沖區(qū)已滿,則嘗試在管道上寫入將被阻止。
以下代碼創(chuàng)建緩沖區(qū)容量為2048字節(jié)的管道輸入和輸出流。
PipedOutputStream pos = new PipedOutputStream(); PipedInputStream pis = new PipedInputStream(pos, 2048);
管道用于將數(shù)據(jù)從一個線程傳輸?shù)搅硪粋€線程。兩個線程之間的同步由阻塞讀和寫來處理。
以下代碼演示了如何使用管道 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(); } } }
上面的代碼生成以下結(jié)果。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: