使用ProcessBuilder以Java运行Perl脚本

问题描述:

我在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; 
} 

可能是操作系统对你的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