使用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。每这篇文章:
由于某些本地平台只提供用于标准输入和输出流有限缓冲区的大小,没有及时写输入流或读出的子过程的输出流可能会导致子阻塞,甚至僵局。
太棒了!你的回答很完美,你把我和一篇伟大的文章联系起来,以便进一步理解。非常感谢你! – Aman 2013-04-26 21:58:25
@Aman:不客气,很高兴我能帮助你。请注意,该文章的部分内容是过时的,因为它不像我们现在应该做的那样使用ProcessBuilder,我相信它的一些Windows调用现在不正确,但是一般原则仍然适用。 – 2013-04-26 22:02:20