一尘不染

Java ProcessBuilder和Runtime.exec()之间的区别

java

我正在尝试从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


阅读 1429

收藏
2020-03-07

共1个答案

一尘不染

各种重载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);
2020-03-07