2009-08-23 58 views
4

在Java中如何让Runtime.exec()运行路径上的程序?我试图运行gpsbabel,我已经放入路径(/ usr/local/bin)。在Java中使用Runtime.exec()

public class GpxLib { 

    public static void main(String[] args) { 
     try 
     { 
      Runtime r = Runtime.getRuntime(); 
      Process p = r.exec("gpsbabel -i garmin -f usb: -o gpx -F -"); 
      InputStream is = p.getInputStream(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      while (true) 
      { 
       String s = br.readLine(); 
       if (s == null) 
        break; 
       System.out.println(s); 
      } 
      br.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 
+0

什么错误/行为,你看见了什么? – 2009-08-23 19:17:18

回答

2

它将继承Java进程的路径。因此,无论Java进程的环境如何,产生的进程都会有。以下是如何检查环境:

Map<String, String> env = System.getenv(); 
for (String envName : env.keySet()) { 
    System.out.format("%s=%s%n", envName, env.get(envName)); 
} 

是否设置了PATH出口呢?如果您不导出它,那么它不适用于子流程。

此外,您必须必须同时消耗stdout和stderr,以防止阻塞。否则,在某些情况下,东西会起作用,然后你产生的过程将输出不同数量的数据,一切都将停止。

有关更多详细信息,请参阅this answer

+0

我没有在任何地方设置路径。无论Eclipse和bash的默认路径如何。 – 2009-08-23 19:24:44

+0

路径将根据用户设置。您可能需要在.bashrc中添加该可执行文件的路径条目(如果从工具栏或类似工具启动Eclipse,也可能再次登录) – 2009-08-23 19:53:58

+0

我认为* real *解决方案是指定二进制文件的完整路径,但是,以便您的程序不依赖于环境,然后将其作为配置项目。这通常是我的战略*方法。 – 2009-08-23 19:55:07

3

无论你做什么,你必须阅读this。没有人阅读,没有人应该使用Runtime.exec()

+0

发现已经......它根本不谈论路径 – 2009-08-23 19:12:35

3

我加入System.out.println(System.getenv("PATH"));通话只打印出

/usr/bin:/bin:/usr/sbin:/sbin 

所以出于某种原因在/ usr/local/bin中显示不出来。看起来这是一个MacOSX问题或Eclipse问题,而不是Java问题。 编辑:而不是this question on superuser

+0

请参阅我的修改答案重新。变量和出口 – 2009-08-23 19:20:05

2

这里是解决方案:

ProcessBuilder proc = new ProcessBuilder("<Directory PAth>" + "Executable.exe"); 
proc.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
proc.directory(fi); //fi = the output directory path 
proc.start(); 

是程序\应用程序的excutable位于e.g路径为 “C:\ MYPROG \”

+0

任何人都可以解释这个代码有什么问题?我已通过调用C++控制台应用程序成功进行了测试。 – DareDevil 2013-12-09 12:39:13

相关问题