2013-04-26 92 views
2

我在Java中使用ProcessBuilder來運行Perl腳本。當我在打印進程的InputStream時運行Perl腳本時,Java程序似乎在Perl腳本期間運行。但是,如果我註釋掉主程序中的getOutPut方法,那麼Java程序會以非常快的速度終止並且Perl腳本根本不會運行。爲什麼會發生?使用ProcessBuilder以Java運行Perl腳本

private final static String SCENARIO = "scen"; 

/** 
* @param args 
*/ 
public static void main(String[] args) { 


    ProcessBuilder pb = new ProcessBuilder("perl", SCENARIO+".pl"); 
    pb.directory(new File("t:/usr/aman/"+SCENARIO)); 
    try { 
     Process p = pb.start(); 
     getOutput(p.getInputStream(), true); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static List getOutput(InputStream is, boolean print) { 
    List output = new ArrayList<String>(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

    String s = null; 
    try { 
     while ((s = reader.readLine()) != null) { 
      output.add(s); 
      if(print){ 
       System.out.println(s); 
      } 
     } 
     is.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     //e.printStackTrace(); 
     return null; 
    } 
    return output; 
} 

回答

2

可能是操作系統對你的PERL腳本過程輸出流緩衝區得到填補,因爲沒有什麼是清空該緩衝區,這將終止進程。您需要捕獲輸出流,因爲這是您的getOutput方法爲您所做的。

請閱讀在這個問題上經典引用:When Runtime.exec() won't。每這篇文章:

由於某些本地平臺只提供用於標準輸入和輸出流有限緩衝區的大小,沒有及時寫輸入流或讀出的子過程的輸出流可能會導致子阻塞,甚至僵局。

+0

太棒了!你的回答很完美,你把我和一篇偉大的文章聯繫起來,以便進一步理解。非常感謝你! – Aman 2013-04-26 21:58:25

+0

@Aman:不客氣,很高興我能幫助你。請注意,該文章的部分內容是過時的,因爲它不像我們現在應該做的那樣使用ProcessBuilder,我相信它的一些Windows調用現在不正確,但是一般原則仍然適用。 – 2013-04-26 22:02:20