2011-09-20 30 views
1

輸出我已經有使用log4j的寫在控制檯輸出的Java程序,而現在我想用另一個Java程序調用的第一個(子過程),並攔截其輸出。 我使用的方法在http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4這個頁面,部分代碼如下圖所示如何攔截子進程的父進程

class StreamRedirector extends Thread 
{ 
InputStream is; 

StreamRedirector(InputStream is) 
{ 
    this.is = is; 
} 

public void run() 
{ 
    try 
    { 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     String line=null; 
     while ((line = br.readLine()) != null) 
     { 
      System.out.println(line); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 
............. 
try 
    { 
     Process p = Runtime.getRuntime().exec("run.bat"); 

     StreamRedirector errSR = new StreamRedirector(p.getErrorStream()); 

     StreamRedirector outSR = new StreamRedirector(p.getInputStream()); 

     errSR.run(); 
     outSR.run(); 

     int exitVal = p.waitFor(); 
     System.out.println("Exit Value: " + exitVal); 
    } 

log4j config: 
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 

    <param name="Target" value="System.out" /> 

    <layout class="org.apache.log4j.PatternLayout"> 

     <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n" /> 
    </layout> 
</appender> 

我可以輸出消息,而只是在「run.bat中」使用呼應XXX,而不是log4j的生成的消息。如果我跑「的run.bat」,我可以看到無論是在控制檯輸出。有沒有辦法,我也可以得到父進程log4j的輸出?謝謝。

回答

1

StreamRedirector延伸Thread但你打電話runstart。這意味着,run獲取調用同步,調用線程。這意味着在下面

errSR.run(); 
    outSR.run(); 

第二行不會執行,直到第一個完成。我想,如果錯誤流不會產生太大輸出,則將最終完成。但那真的是你打算怎麼做的?相反,如果程序使用log4j我勸你考慮SocketAppender抓住什麼是從一個不同的進程寫入的嘗試

errSR.start(); 
    outSR.start(); 

EIDT:另一種方法是StreamRedirector擴展Runnable而不是Thread。然後調用代碼更改爲

Thread errorThread = new Thread(new StreamRedirector(p.getErrorStream())); 
.... 
errorThread.start(); 

這不會阻止你打電話errorThread.run(),但如果你調用它,然後它會立即返回(而不是阻塞,因爲它目前如此)表明,什麼是錯。

+1

非常感謝血管,對不起,我作出這樣一個愚蠢的錯誤:P – daniel

+0

Yould驚訝有多少人犯類似的錯誤。看看我上面的編輯如何避免它。 –