我正在使用Java语言中的ProcessBuilder来运行Perl脚本。当我在打印进程的InputStream的同时运行Perl脚本时,Java程序似乎在Perl脚本期间运行。但是,如果我注释掉main中的getOutPut方法,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;
}发布于 2013-04-27 05:08:54
操作系统用于PERL脚本进程的输出流缓冲区可能会被填满,因为没有任何东西在清空该缓冲区,这将终止该进程。出于这个原因,您需要吞噬输出流,这就是getOutput方法为您做的事情。
请阅读关于这个问题的经典参考:When Runtime.exec() won't。根据这篇文章:
由于一些本机平台仅为标准输入和输出流提供有限的缓冲区大小,未能及时写入输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁。
https://stackoverflow.com/questions/16245243
复制相似问题