Java技巧使用管道數(shù)據(jù)流傳送數(shù)據(jù)
發(fā)表時(shí)間:2023-08-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Java I/O系統(tǒng)是建立在數(shù)據(jù)流概念之上的,在UNIX操作系統(tǒng)中有一個(gè)類似的概念很流行,那就是管道,它具有將一個(gè)程序的輸出當(dāng)作另一個(gè)程序的輸入的能力。 Java為這種管道概念提供了PipedInp...
Java I/O系統(tǒng)是建立在數(shù)據(jù)流概念之上的,在UNIX操作系統(tǒng)中有一個(gè)類似的概念很流行,那就是管道,它具有將一個(gè)程序的輸出當(dāng)作另一個(gè)程序的輸入的能力。
Java為這種管道概念提供了PipedInputStream和PipedOutputStream類。將這兩者結(jié)合在一起,它們?cè)试S一個(gè)Java組件輸出數(shù)據(jù)到輸出流,而另一個(gè)組件將這個(gè)輸出流當(dāng)作輸入流來讀取。
舉個(gè)例子可以說明,比如一個(gè)用來記錄應(yīng)用程序日志信息的組件和一個(gè)用來顯示流數(shù)據(jù)動(dòng)態(tài)報(bào)表的組件。通過給日志記錄組件提供PipedOutputStream,給報(bào)表組件提供相應(yīng)的PipedInputStream,這兩個(gè)組件就不用知道對(duì)方的情況而可以相互通信。
最簡(jiǎn)單的情況下,代碼段如下所示:
importjava.io.*;
public class Foo {
static public void main(String[] args) throwsIOException {
PipedOutputStream pout = newPipedOutputStream();
PipedInputStream= new PipedInputStream(pout);
for(int i=0; i 〈 100; i++) {
pout.write((byte)i );
}
pout.close();
int j=0;
while( (j = pin.read()) != -1)
{
System.err.println(j);
}
pin.close();
}
}
上面的代碼中,一定要記得調(diào)用close()以關(guān)閉輸出流"pout",否則第二輪循環(huán)永遠(yuǎn)也不會(huì)結(jié)束。
這個(gè)粗泛的例子并不是正常的可用的代碼。隨著第一輪循環(huán)數(shù)量越來越大,PipedOutputStream中的緩沖將會(huì)用盡,從而出現(xiàn)問題,比如它在等待某些程序從流里面刪除數(shù)據(jù)時(shí)會(huì)導(dǎo)致線程死鎖。
這就是為什么管道流的Javadoc中聲明了PipedInputStream和PipedOutputStream必須用在多線程環(huán)境里面的原因。