我必须写下一些运行外部进程的java代码。 此过程从stdin获取输入行,并在stdout上提供输出行。
我写的代码如下
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("./" + args[0]);
Process proc2 = rt.exec(c);
int exitVal = proc2.exitValue();
System.out.println("Process exitValue: " + exitVal);
}
catch (Throwable t){
}
其中args [0]是外部进程,c是输入(String)我需要提供给进程。如果它运行正常,我会得到一个exitVal = 0,而我什么也得不到。另外,我真正想要打印的是外部进程的输出(在给定示例中为“6”)。
答案 0 :(得分:2)
您必须在流程上使用getInputStream()
和getOutputStream()
进行沟通,请参阅javadocs。
如果您没有从进程中读取所有数据,它可能会挂起甚至死锁。有关常见问题的简短介绍,请参阅this blog post。至少,您应该从过程输出中读取所有数据。
答案 1 :(得分:0)
你不能“一无所获”。方法exitValue()
返回基本类型,因此它甚至不能为空。但是这种方法可能会卡住。这是因为您的进程仍在运行。
它是否可能正在运行,因为你没有“喂”它?在这种情况下,您唯一需要做的就是调用proc2.getOutputStream()
并写下您对此流所需的内容。如果您想阅读流程'输出使用proc2.getInputStream()
并从流中读取。
BTW,请看ProcessBuilder
。它提供了更好,更“面向对象”的API,简单Runtime.exec()
。
答案 2 :(得分:0)
您可以使用'<'来输入程序输入重定向:
{
Process p = Runtime.getRuntime().exec("wc < pom.xml");
p.waitFor();
System.out.println(p.exitValue());
BufferedReader bri = new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
while ((line = bri.readLine()) != null) {
System.out.println(line);
}
bri.close();
}