Использование Runtime.exec() в Java
Что вы должны сделать в 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 ответа
Он унаследует путь от процесса 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 одновременно, чтобы предотвратить блокировку. В противном случае вещи будут работать в некоторых обстоятельствах, тогда ваш порожденный процесс выведет другое количество данных, и все остановится.
Смотрите этот ответ для более подробной информации.
Я добавил звонок System.out.println(System.getenv("PATH"));
который только распечатывает
/usr/bin:/bin:/usr/sbin:/sbin
поэтому по какой-то причине /usr/local/bin не отображается. Похоже, что это вопрос MacOSX или Eclipse, а не вопрос Java. редактировать: вместо этого задал этот вопрос на суперпользователя.
Что бы вы ни делали, вы должны прочитать это. Никто не должен использовать Runtime.exec()
не прочитав это.
Вот решение:
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\"