为了账号安全,请及时绑定邮箱和手机立即绑定

ProcessBuilder与Runtime.exec()的区别

/ 猿问

ProcessBuilder与Runtime.exec()的区别

明月笑刀无情 2019-10-12 19:07:48

ProcessBuilder与Runtime.exec()的区别

我试图从java代码中执行一个外部命令,但我注意到Runtime.getRuntime().exec(...)new Process(...).start().

使用时Runtime:

Process p = Runtime.getRuntime().exec(installation_path + 
                                       uninstall_path + 
                                       uninstall_command + 
                                       uninstall_arguments);p.waitFor();

exitValue为0,命令终止为ok。

然而,与ProcessBuilder:

Process p = (new ProcessBuilder(installation_path +    
                                 uninstall_path +
                                 uninstall_command,
                                 uninstall_arguments)).start();p.waitFor();

退出值为1001,命令在中间终止,尽管waitFor退货。

我该怎么做才能解决这个问题?ProcessBuilder?


查看完整描述

3 回答

?
holdtom

各种超载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);



查看完整回答
反对 回复 2019-10-13
?
慕桂英546537

看看Runtime.getRuntime().exec()将字符串命令传递给ProcessBuilder..它使用令牌程序并将命令分解为单个令牌,然后调用exec(String[] cmdarray, ......)构造ProcessBuilder.

如果您构造ProcessBuilder使用字符串数组而不是单个字符串,您将得到相同的结果。

这个ProcessBuilder构造函数采用String...因此,将整个命令作为单个字符串传递与在终端中以引号调用该命令具有相同的效果:

shell$ "command with args"



查看完整回答
反对 回复 2019-10-13
?
POPMUISE

是的有区别。

因此,您要告诉ProcessBuilder执行一个“命令”,其名称中包含空格和其他垃圾。当然,操作系统找不到具有该名称的命令,并且命令执行失败。



查看完整回答
反对 回复 2019-10-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信