在JAVA中使用ProcessBuilder我可以运行简单的终端命令,如ls,pwd,echo等。等等... 但是下面的代码被终止了,不知道为什么??
public static void main(String[] args) throws Exception
{
Runtime r = Runtime.getRuntime();
Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
p.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = b.readLine()) != null)
{
System.out.println(line);
}
}
此命令在终端上运行良好,大约需要15秒才能运行并提供输出。 我在stackoverflow上经历了类似的主题,但没有找到任何帮助。 请帮忙。 提前谢谢。
答案 0 :(得分:2)
参考此代码,这可能有助于你....使用bash。只需用echo命令替换你的命令
ProcessBuilder b = new ProcessBuilder(“bash”,“ - c”,“echo abc”);
Process termProc = null;
try {
termProc = b.start();
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(termProc.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(termProc.getErrorStream()));
String s = null;
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
答案 1 :(得分:0)
考虑监控InputStream和ErrorStream。有可能输出可能被写入ErrorStream,这就是为什么你没有看到任何显示的东西。
来自Javaworld的Here's a good example关于Runtime.exec()的一些常见陷阱以及如何使用它。
<小时/> 我在第一次看你的代码时错过了它,但是这里暗示了你可能做错了什么:
因为某些本机平台仅提供有限的缓冲区大小 标准输入和输出流,无法及时写入输入 流或读取子进程的输出流可能会导致 要阻止的子进程,甚至是死锁。
考虑对这些代码进行更新:
public static void main(String[] args) throws Exception
{
Runtime r = Runtime.getRuntime();
Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = b.readLine()) != null)
{
System.out.println(line);
}
BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";
while ((line = b.readLine()) != null)
{
System.out.println(line);
}
p.waitFor();
}
注意:我建议创建线程来处理输入来自inputstream和errorstream的输出,如我在上面发布的示例链接中所示。