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字節的數據。在t線程阻塞之前,它最多能夠寫入1024字節的數據(PipedInputStream內部緩沖區的大。。然而,一旦t被阻塞,讀取 PipedInputStream的操作就再也不會出現,因為t是唯一讀取PipedInputStream的線程。這樣,t線程已經完全被阻塞,同時,所有其他試圖向PipedOutputStream寫入數據的線程也將遇到同樣的情形。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/