Различные перегрузки Runtime.getRuntime().exec(...)
принимают либо массив строк, либо одну строку.Одностроковые перегрузки exec()
преобразуют строку в массив аргументов перед передачей строкового массива в одну из перегрузок exec()
, которая принимает строковый массив.С другой стороны, конструкторы ProcessBuilder
принимают только массив строк varargs или List
строк, где каждая строка в массиве или списке считается отдельным аргументом.В любом случае полученные аргументы затем объединяются в строку, которая передается в ОС для выполнения.
Так, например, в Windows
Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
будет запускать DoStuff.exe
программа с двумя заданными аргументами.В этом случае командная строка получает токены и собирается обратно.Тем не менее,
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");
завершится ошибкой, если не будет программы с именем DoStuff.exe -arg1 -arg2
в C:\
.Это связано с тем, что токенизации нет: предполагается, что выполняемая команда уже токенизирована.Вместо этого вы должны использовать
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
или альтернативно
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2");
ProcessBuilder b = new ProcessBuilder(params);