using Runtime.exec() in Java

折月煮酒 提交于 2019-12-17 13:27:13

问题


What do you have to do in Java to get the Runtime.exec() to run a program that is on the path? I'm trying to run gpsbabel which I have put into the path (/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);
        }
    }
}

回答1:


It will inherit the path from the Java process. So whatever environment the Java process has, the spawned process will have as well. Here's how to check the environment:

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

Have you set the PATH and exported it ? If you don't export it, then it's not available to subprocesses.

Additionally, you must consume stdout and stderr concurrently, to prevent blocking. Otherwise stuff will work in some circumstances, then your spawned process will output a different quantity of data and everything will grind to a halt.

See this answer for more details.




回答2:


I added a call to System.out.println(System.getenv("PATH")); which only prints out

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

so for some reason /usr/local/bin doesn't show up. Looks like this is a MacOSX question or an Eclipse question, not a Java question. edit: asked this question on superuser instead.




回答3:


Whatever you do, you must read this. No one should use Runtime.exec() without having read it.




回答4:


Here is the solution:

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

is the path where program\application's excutable is located e.g "C:\MyProg\"



来源:https://stackoverflow.com/questions/1319286/using-runtime-exec-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!