在Java中使用Runtime.exec()

你需要在Java中做什么才能让Runtime.exec()运行路径上的程序? 我正在尝试运行我已放入路径的gpsbabel(/ usr / local / bin)。

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); } } } 

它将inheritanceJava进程的路径。 因此,无论Java进程具有什么环境,生成的进程都会有。 以下是检查环境的方法:

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

你有没有设置PATH 导出它? 如果不导出它,则子进程无法使用它。

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

有关详细信息,请参阅此答案 。

我添加了对System.out.println(System.getenv("PATH"));的调用System.out.println(System.getenv("PATH")); 只打印出来的

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

所以由于某种原因/ usr / local / bin没有显示出来。 看起来这是一个MacOSX问题或Eclipse问题,而不是Java问题。 编辑: 在超级用户上询问此问题 。

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

这是解决方案:

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

是程序\应用程序的可删除位置的路径,例如“C:\ MyProg”