Java技巧使用管道數據流傳送數據
發表時間:2023-08-17 來源:明輝站整理相關軟件相關文章人氣:
[摘要]Java I/O系統是建立在數據流概念之上的,在UNIX操作系統中有一個類似的概念很流行,那就是管道,它具有將一個程序的輸出當作另一個程序的輸入的能力。 Java為這種管道概念提供了PipedInp...
Java I/O系統是建立在數據流概念之上的,在UNIX操作系統中有一個類似的概念很流行,那就是管道,它具有將一個程序的輸出當作另一個程序的輸入的能力。
Java為這種管道概念提供了PipedInputStream和PipedOutputStream類。將這兩者結合在一起,它們允許一個Java組件輸出數據到輸出流,而另一個組件將這個輸出流當作輸入流來讀取。
舉個例子可以說明,比如一個用來記錄應用程序日志信息的組件和一個用來顯示流數據動態報表的組件。通過給日志記錄組件提供PipedOutputStream,給報表組件提供相應的PipedInputStream,這兩個組件就不用知道對方的情況而可以相互通信。
最簡單的情況下,代碼段如下所示:
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();
}
}
上面的代碼中,一定要記得調用close()以關閉輸出流"pout",否則第二輪循環永遠也不會結束。
這個粗泛的例子并不是正常的可用的代碼。隨著第一輪循環數量越來越大,PipedOutputStream中的緩沖將會用盡,從而出現問題,比如它在等待某些程序從流里面刪除數據時會導致線程死鎖。
這就是為什么管道流的Javadoc中聲明了PipedInputStream和PipedOutputStream必須用在多線程環境里面的原因。