2011-10-01 16 views
0

我創建了一個處理文件的類,如果遇到某些特定的錯誤,它會向錯誤流輸出相關的錯誤消息。訪問程序消息輸出到錯誤流

我正在處理另一個需要訪問這些錯誤消息的類。我不知道如何做到這一點。我是Java編程的初學者。基於我有限的知識,我認爲我的兩個選擇是要麼調用第一類的主要方法(但我不知道如何在這種情況下得到錯誤消息)或執行編譯的類和訪問通過Process類的getErrorStream()方法發送消息。但是,我遇到系統死鎖問題,甚至可能不執行exec命令,所以我不確定如何實現第二種情況。

回答

0

我不太清楚你在這裏問什麼,但是你的代碼的一個潛在問題是你沒有從這個過程的stdout中讀取數據。根據Process API,「未能及時...讀取子進程的輸出流可能導致子進程阻塞,甚至死鎖。」這是你提到的「麻煩」嗎?所以,你可以做你正在做的事情,但一定要閱讀錯誤流和輸出流(見我的評論),或者你可以直接從main方法調用main方法。你的代碼,在這種情況下,錯誤輸出將被寫入System.err。您可以使用System.setErr()安裝您自己的流,以便讓您獲得寫入的內容,但請記住,從您自己的應用程序輸出的任何錯誤(即運行其他應用程序的錯誤)也會顯示在此處。這聽起來像產生一個單獨的過程,就像你已經在做的那樣,就是你想要的。

+0

我認爲這可能是錯誤。當執行那部分代碼時,程序會卡住並無限制地終止。我不知道如何解決它。我想是最基本的形式,我的問題是關於如何執行第一個java類並從第二個java類訪問它的錯誤流消息。 – dpryor

+0

是的,這就是您不使用輸出流時的樣子。您刪除了代碼,但我不記得它的樣子,但它一次調用Process.getErrorStream(),並且在等待進程退出時,您正在不斷讀取它。你必須爲[Process.getOutputStream()](http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#getOutputStream%28%29)做同樣的事情。即使你只是忽略你從中讀取的內容,也必須這樣做,否則就有可能無限期地阻止進程。 –

+0

也更新了我的答案 –

0

您不能用主要方法基於許多小程序構建模塊化。您必須將函數塊設置爲專門用於從別處調用的類 - 這意味着以某種編程方式返回狀態信息,而不僅僅是將其發佈到System.err上。如果它確實是錯誤,則拋出異常。如果你必須返回狀態,設計一個數據結構來保存狀態並返回。但是不要到處推出新的流程並閱讀錯誤流。