Java ProcessBuilder和Runtime.exec()之间的区别
我正在尝试从Java代码执行外部命令,但我注意到了Runtime.getRuntime().exec(...)
和之间的区别new ProcessBuilder(...).start()
。
使用时Runtime:
Process p = Runtime.getRuntime().exec(installation_path + uninstall_path +
uninstall_command +
uninstall_arguments);
p.waitFor();
exitValue为0,命令终止正常。
但是,使用ProcessBuilder
:
Process p = (new ProcessBuilder(installation_path + uninstall_path +
uninstall_command,
uninstall_arguments)).start();
p.waitFor();
退出值为1001
,尽管waitFor
返回,该命令在中间终止。
我该怎么办才能解决问题ProcessBuilder
?
回答:
各种重载Runtime.getRuntime().exec(...)
可以采用字符串数组或单个字符串。exec()在将字符串数组传递到采用字符串数组的exec()
重载之一之前,的单字符串重载将把字符串标记为参数数组。的ProcessBuilder
构造,在另一方面,只需要一可变参数串或阵列List
串,其中假定该阵列或列表中的每个字符串为一个单独的参数。不管哪种方式,然后将获得的参数合并为一个字符串,然后将其传递给OS
以执行。
因此,例如在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);
以上是 Java ProcessBuilder和Runtime.exec()之间的区别 的全部内容, 来源链接: utcz.com/qa/434590.html