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