我正在 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;
}
最佳答案
操作系统的 PERL 脚本进程的输出流缓冲区可能会被填满,因为没有任何东西清空该缓冲区,这将终止该进程。因此,您需要吞噬输出流,这就是您的 getOutput 方法为您所做的事情。
请阅读关于此问题的经典引用:When Runtime.exec() won't 。根据这篇文章:
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
关于java - 使用 ProcessBuilder 在 Java 中运行 Perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245243/