摘要:不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能會(huì)造成該線程死鎖。構(gòu)造函數(shù)創(chuàng)建尚未連接到管道輸入流的管道輸出流。通常,數(shù)據(jù)由某個(gè)線程從對(duì)象讀取,并由其他線程將其寫入到相應(yīng)的。
管道流
PipedOutputStream管道流的主要作用是可以進(jìn)行兩個(gè)線程間的通訊,分為管道輸出流(PipedOutputStream)、管道輸入流(PipedInputStream),如果想要進(jìn)行管道輸出,則必須要把輸出流連在輸入流之上,在PipedOutputStream類上有如下的一個(gè)方法用于連接管道:
public void connect(PipedInputStream snk)throws IOException通常是創(chuàng)建兩個(gè)多帶帶的線程來(lái)實(shí)現(xiàn)通信,如果是單個(gè)線程的話容易出現(xiàn)線程堵塞,因?yàn)檩敵隽髯疃嘀荒芟蚓彌_區(qū)寫入1024個(gè)字節(jié)的數(shù)據(jù),如果超出就會(huì)出現(xiàn)線程堵塞,因此必須創(chuàng)建多個(gè)線程實(shí)現(xiàn)緩沖區(qū)的釋放和存儲(chǔ)
構(gòu)造函數(shù)管道輸出流是管道的發(fā)送端,可以將管道輸出流連接到管道輸入流來(lái)創(chuàng)建一個(gè)通信管道,通常,數(shù)據(jù)由某個(gè)線程寫入 PipedOutputStream 對(duì)象,并由其他線程從連接的 PipedInputStream 讀取。不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能會(huì)造成該線程死鎖。如果某個(gè)線程正從連接的管道輸入流中讀取數(shù)據(jù)字節(jié),但該線程不再處于活動(dòng)狀態(tài),則該管道被視為處于 毀壞 狀態(tài)。
常用函數(shù)PipedOutputStream() 創(chuàng)建尚未連接到管道輸入流的管道輸出流。
PipedOutputStream(PipedInputStream snk) 創(chuàng)建連接到指定管道輸入流的管道輸出流。
PipedInputStreamclose() 關(guān)閉
void connect(PipedInputStream snk) 將此管道輸出流連接到接收者。
void flush() 刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。
void write(byte[] b, int off, int len) 將 len 字節(jié)從初始偏移量為 off 的指定 byte 數(shù)組寫入該管道輸出流。
void write(int b) 將指定 byte 寫入傳送的輸出流。
構(gòu)造函數(shù)管道輸入流應(yīng)該連接到管道輸出流;管道輸入流提供要寫入管道輸出流的所有數(shù)據(jù)字節(jié)。通常,數(shù)據(jù)由某個(gè)線程從 PipedInputStream 對(duì)象讀取,并由其他線程將其寫入到相應(yīng)的 PipedOutputStream。不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能死鎖線程。管道輸入流包含一個(gè)緩沖區(qū),可在緩沖區(qū)限定的范圍內(nèi)將讀操作和寫操作分離開。 如果向連接管道輸出流提供數(shù)據(jù)字節(jié)的線程不再存在,則認(rèn)為該管道已損壞。
常用函數(shù)PipedInputStream() 創(chuàng)建尚未連接的 PipedInputStream。
PipedInputStream(PipedOutputStream src) 創(chuàng)建 PipedInputStream,使其連接到管道輸出流 src。
實(shí)例int available() 返回可以不受阻塞地從此輸入流中讀取的字節(jié)數(shù)。
void close() 關(guān)閉此管道輸入流并釋放與該流相關(guān)的所有系統(tǒng)資源。
void connect(PipedOutputStream src) 使此管道輸入流連接到管道輸出流 src。
int read() 讀取此管道輸入流中的下一個(gè)數(shù)據(jù)字節(jié)。
int read(byte[] b, int off, int len) 將最多 len 個(gè)數(shù)據(jù)字節(jié)從此管道輸入流讀入 byte 數(shù)組。
protected void receive(int b) 接收數(shù)據(jù)字節(jié)。
package IO; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; /** * Created by chenjiabing on 17-5-25. */ /** * 注意的問(wèn)題: * 1.寫線程正在往緩沖區(qū)寫數(shù)據(jù)的時(shí)候,但是此時(shí)的讀線程的管道結(jié)束,那么此時(shí)的寫線程的管道就會(huì)發(fā)生IOException異常 * 2.讀線程正在從緩沖區(qū)讀數(shù)據(jù)的時(shí)候,但是此時(shí)的寫線程的管道已經(jīng)結(jié)束了,此時(shí)就會(huì)引起讀線程的管道發(fā)生IOException異常 * 3.必須是啟用多線程才能實(shí)現(xiàn)管道之間的讀寫,否則會(huì)出現(xiàn)堵塞現(xiàn)象,因?yàn)檫@里的PipeOutputStream每次向緩沖區(qū)寫入的字節(jié)數(shù)最大是1024,如果不及時(shí)的減少緩沖區(qū)的數(shù)據(jù)量就會(huì)出現(xiàn)堵塞 */ public class demo7 { public static PipedOutputStream outputStream = new PipedOutputStream(); public static PipedInputStream inputStream = new PipedInputStream(); /** * 創(chuàng)建一個(gè)寫入數(shù)據(jù)進(jìn)程,使用的是PipeOutStream,將數(shù)據(jù)寫入管道中 */ public static void send() { new Thread(new Runnable() { @Override public void run() { byte[] bytes = new byte[2000]; //創(chuàng)建一個(gè)2000字節(jié)的數(shù)組 while (true) { try { outputStream.write(bytes, 0, 2000); //寫入管道,但是這里的緩沖區(qū)最多寫入1024個(gè)字節(jié)的數(shù)據(jù),因此這個(gè)是一次沒有寫完 System.out.println("寫入成功"); } catch (IOException e) { System.out.println("寫入失敗"); System.exit(1); } } } }).start(); } /** * 使用PipeInputStream創(chuàng)建一個(gè)讀取的線程 */ public static void receive() { new Thread(new Runnable() { @Override public void run() { byte[] bytes = new byte[100]; //一次性只讀取100個(gè)字節(jié) int len = 0; try { len = inputStream.read(bytes, 0, 100); //讀取 while (len != -1) { System.out.println("已經(jīng)讀取了" + len + "個(gè)字節(jié)"); len = inputStream.read(bytes, 0, 100); } } catch (IOException e) { System.out.println("讀取失敗"); System.exit(1); } } }).start(); } public static void main(String args[]) { try { inputStream.connect(outputStream); //連接 } catch (IOException e) { System.out.println("連接失敗"); System.exit(1); } send(); receive(); } }
問(wèn)題注意:從上面的運(yùn)行結(jié)果可以看出,緩沖區(qū)最多可以寫入1024個(gè)字節(jié)的數(shù)據(jù),所以在緩沖區(qū)滿了之后上面的send進(jìn)程就會(huì)堵塞等待緩沖區(qū)空閑,如果recieve進(jìn)程不繼續(xù)讀取數(shù)據(jù)了,那么就會(huì)一直出現(xiàn)堵塞
解決方法寫線程正在往緩沖區(qū)寫數(shù)據(jù)的時(shí)候,但是此時(shí)的讀線程的結(jié)束讀取,那么此時(shí)的寫線程的管道就會(huì)發(fā)生IOException異常,可以將上面receive進(jìn)程中的while(true)去掉就可以清楚的看出
讀線程正在從緩沖區(qū)讀數(shù)據(jù)的時(shí)候,但是此時(shí)的寫線程的管道已經(jīng)結(jié)束了,此時(shí)就會(huì)引起讀線程的管道發(fā)生IOException異常,將上面的send進(jìn)程中的while(true)去掉就可以實(shí)現(xiàn)這個(gè)問(wèn)題
必須是啟用多線程才能實(shí)現(xiàn)管道之間的讀寫,否則會(huì)出現(xiàn)堵塞現(xiàn)象,因?yàn)檫@里的PipeOutputStream每次向緩沖區(qū)寫入的字節(jié)數(shù)最大是1024,如果不及時(shí)的減少緩沖區(qū)的數(shù)據(jù)量就會(huì)出現(xiàn)堵塞
參考文章后續(xù)更新中..........
http://www.cnblogs.com/lich/archive/2011/12/11/2283928.html
http://ifeve.com/java-io-%E7%AE%A1%E9%81%93/
http://www.cnblogs.com/chinareny2k/archive/2010/03/24/1693878.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67120.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨(dú)墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個(gè)新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計(jì)模式之單例模式 - 掘金前言 作為一個(gè)好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會(huì)去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過(guò)程中不免會(huì)去閱讀源碼,這也是一個(gè)優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過(guò)程中很多人會(huì)遇到的障礙,那就是設(shè)計(jì)模式。很多優(yōu)秀的框架會(huì)運(yùn)...
摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來(lái)說(shuō)中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過(guò)的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來(lái)了,便于大家學(xué)習(xí)與回顧。 Ja...
摘要:簡(jiǎn)介簡(jiǎn)介也稱作套接字,是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。它分為流式套接字和數(shù)據(jù)包套接字,分別對(duì)應(yīng)網(wǎng)絡(luò)傳輸控制層的和協(xié)議。1.Socket簡(jiǎn)介 Socket也稱作套接字,是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。它分為流式套接字和數(shù)據(jù)包套接字,...
閱讀 687·2021-09-30 09:47
閱讀 2876·2021-09-04 16:40
閱讀 864·2019-08-30 13:18
閱讀 3457·2019-08-29 16:22
閱讀 1563·2019-08-29 12:36
閱讀 593·2019-08-29 11:11
閱讀 1483·2019-08-26 13:47
閱讀 1134·2019-08-26 13:32