ProcessBuilder 与 Runtime.exec():了解差异
当尝试从 Java 执行外部命令时,开发人员经常会遇到差异Runtime.exec() 和 ProcessBuilder.start() 之间的行为。
Runtime.exec():
使用 Runtime.getRuntime().exec() 涉及一个两步过程:标记化和执行。输入字符串在执行之前会被解析并转换为参数数组。
ProcessBuilder:
相比之下,ProcessBuilder 的操作方式有所不同。它的构造函数接受一个可变参数数组或字符串列表,其中每个字符串代表一个单独的参数。然后将参数组合成单个字符串并传递给操作系统。
对执行的影响:
参数处理中的这种差异可能会影响命令。例如,如果命令包含空格,Runtime.exec() 将自动处理标记化,而 ProcessBuilder 需要显式创建参数数组或列表。
示例:
考虑以下带有空格的命令:
"C:\DoStuff.exe -arg1 -arg2"
使用 Runtime.exec():
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
在这种情况下,命令将按预期执行,exitValue 将为 0。
使用 ProcessBuilder:
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
但是,直接使用 ProcessBuilder 而不进行标记化将导致错误或意外行为,返回exitValue 为 1001。要纠正此问题,您必须显式创建参数数组:
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
摘要:
一般来说,在使用 ProcessBuilder 时,必须提供将参数作为单独的列表或数组,明确指示每个单独的参数。此附加步骤可确保正确解析参数并按预期执行外部命令。
以上是Runtime.exec() 与 ProcessBuilder.start():什么时候应该使用它们?的详细内容。更多信息请关注PHP中文网其他相关文章!