从Java执行外部程序

时间:2010-05-20 15:12:28

标签: java macos terminal

我正在尝试从Java代码执行程序。这是我的代码:

public static void main(String argv[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec(new String[]{
          "/bin/bash", "-c", "executable -o filename.txt"});
      BufferedReader input = new BufferedReader(
          new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    } catch (Exception err) {
      err.printStackTrace();
    }
}

我的操作系统是Mac OS X 10.6。

现在,我尝试运行的可执行文件应该将输出吐出到filename.txt。如果我使用此命令并在终端上运行它,它工作正常,并且filename.txt也会填充。但是,从我的java程序中,不会创建该文件。

如果相反,我使用可执行文件> filename.txt然后创建filename.txt但是为空。不知道这里有什么问题。我试图运行的可执行文件是Xtide(如果有帮助的话)。

我真的很感激我能得到的任何帮助。

谢谢,

3 个答案:

答案 0 :(得分:2)

您无法将输出重定向到文件并读取java中的输出。这是一个或另一个。你想要的是这个:

      Process p = Runtime.getRuntime().exec(new String[]{
          "/bin/bash", "-c", "executable -o filename.txt"});
      p.waitFor();
      BufferedReader input = new BufferedReader(
          new InputStreamReader(new FileInputStream("filename.txt")));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }

主要变化是:

  • p.waitFor(),因为流程执行是异步的,所以你必须等待它完成。
  • 从文件而不是从进程的输出中读取数据(因为这将是空的。)

答案 1 :(得分:1)

mdma的答案有效(我投票了),但您可能还想考虑直接从executable读取输出流的版本:

Process p = Runtime.getRuntime().exec(new String[]{
          "/bin/bash", "-c", "executable"});
p.waitFor();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())_;
while ((line = input.readLine()) != null) {
    System.out.println(line);
}

答案 2 :(得分:0)

如果我错了,请纠正我,但症状如下:

  • exec("/usr/bash", "-c", "executable > filename.txt")创建一个空文件。
  • exec("/usr/bash", "-c", "executable -o filename.txt")不会创建文件。
  • 当您查看时,上面的一个或两个都会提供退出代码255
  • 当您从命令行以executable -o filename.txtexecutable > filename.txt运行命令时,它会按预期工作。

鉴于上述情况,我认为最可能的原因是/bin/bash在从Java启动时找不到executable。第一个示例创建一个空文件的事实意味着/bin/bash正在做某事。但是如果你试图运行

$ unknown-command > somefile.txt

从bash shell提示符中,您将收到一条错误消息,指出无法找到该命令和一个空的“something.txt”文件。 (您不会在Java应用程序中看到错误消息,因为它正在写入stderr,而您没有捕获它。)创建空“something.txt”文件的原因是它由shell打开< em>在之前它尝试fork并执行“可执行文件”。

如果这是问题,那么简单的解决方案就是使用可执行文件的绝对路径名。

此外,如果您没有执行任何命令行重定向或其他shell魔术,则无需在新的bash实例中运行可执行文件。相反,只需这样做:

Process p = Runtime.getRuntime().exec("executable", "-o", filename.txt");

然后在尝试读取文件内容之前等待进程完成并检查退出代码。