Java运行bash命令,同时提供输入和获取输出

时间:2012-03-28 12:45:13

标签: java process execute

我必须写下一些运行外部进程的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”)。

3 个答案:

答案 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();
}