天天看點

Java中管道流是什麼,JAVA IO之管道流總結大全

一、Java管道流

要在文本框中顯示控制台輸出,我們必須用某種方法“截取”控制台流。換句話說,我們要有一種高效地讀取寫入到System.out和System.err 所有内容的方法。如果你熟悉Java的管道流PipedInputStream和PipedOutputStream,就會相信我們已經擁有最有效的工具。

寫入到PipedOutputStream輸出流的資料可以從對應的PipedInputStream輸入流讀取。Java的管道流極大地友善了我們截取控制台輸出。Listing 1顯示了一種非常簡單的截取控制台輸出方案。

【Listing 1:用管道流截取控制台輸出】

PipedInputStream pipedIS = new PipedInputStream();

PipedOutputStream pipedOS = new PipedOutputStream();

try {

pipedOS.connect(pipedIS);

}

catch(IOException e) {

System.err.println("連接配接失敗");

System.exit(1);

}

PrintStream ps = new PrintStream(pipedOS);

System.setOut(ps);

System.setErr(ps);

可以看到,這裡的代碼極其簡單。我們隻是建立了一個PipedInputStream,把它設定為所有寫入控制台流的資料的最終目的地。所有寫入到控制台流的資料都被轉到PipedOutputStream,這樣,從相應的PipedInputStream讀取就可以迅速地截獲所有寫入控制台流的資料。接下來的事情似乎隻剩下在Swing JTextArea中顯示從pipedIS流讀取的資料,得到一個能夠在文本框中顯示控制台輸出的程式。遺憾的是,在使用Java管道流時有一些重要的注意事項。隻有認真對待所有這些注意事項才能保證Listing 1的代碼穩定地運作。下面我們來看第一個注意事項。

1.1 注意事項一

PipedInputStream運用的是一個1024位元組固定大小的循環緩沖區。寫入PipedOutputStream的資料實際上儲存到對應的 PipedInputStream的内部緩沖區。從PipedInputStream執行讀操作時,讀取的資料實際上來自這個内部緩沖區。如果對應的 PipedInputStream輸入緩沖區已滿,任何企圖寫入PipedOutputStream的線程都将被阻塞。而且這個寫操作線程将一直阻塞,直至出現讀取PipedInputStream的操作從緩沖區删除資料。

這意味着,向PipedOutputStream寫資料的線程不應該是負責從對應PipedInputStream讀取資料的唯一線程。從圖二可以清楚地看出這裡的問題所在:假設線程t是負責從PipedInputStream讀取資料的唯一線程;另外,假定t企圖在一次對 PipedOutputStream的write()方法的調用中向對應的PipedOutputStream寫入2000位元組的數