использование Runtime.exec () в Java - PullRequest
4 голосов
/ 23 августа 2009

Что вы должны сделать в 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);
        }
    }
}

Ответы [ 4 ]

3 голосов
/ 23 августа 2009

Я добавил вызов на System.out.println(System.getenv("PATH"));, который печатает только

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

, поэтому по какой-то причине / usr / local / bin не отображается. Похоже, что это вопрос MacOSX или вопрос Eclipse, а не вопрос Java. изменить: задал этот вопрос вместо суперпользователя .

3 голосов
/ 23 августа 2009

Что бы вы ни делали, вы должны прочитать это . Никто не должен использовать Runtime.exec(), не прочитав его.

2 голосов
/ 26 сентября 2013

Вот решение:

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

- это путь, по которому находится исполняемый файл программы \ приложения, например, "C: \ MyProg \"

2 голосов
/ 23 августа 2009

Он унаследует путь от процесса 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 одновременно, чтобы предотвратить блокировку. В противном случае вещи будут работать при некоторых обстоятельствах, тогда ваш порожденный процесс выведет другое количество данных, и все остановится.

См. этот ответ для более подробной информации.

...