使用显式的参数列表和 ProcessBuilder 配置来启动进程。
代码对比
✕ Command string
Process process = Runtime.getRuntime()
.exec("git show " + revision);
✓ ProcessBuilder
Process process = new ProcessBuilder(
"git", "show", revision)
.redirectErrorStream(true)
.start();
发现此代码有问题? 告诉我们。
为什么现代方式更好
精确的参数
每个进程参数都保持为独立的值,不经过命令字符串分词。
显式配置
环境、目录、重定向与错误处理可以一起配置。
更安全的边界
避免用动态值拼接出类似 shell 的命令字符串。
旧方式
Runtime.exec(String)
现代方式
ProcessBuilder
自 JDK
5
难度
中级
JDK 支持
从 Runtime.exec(String) 到 ProcessBuilder 参数
可用
自 JDK 5 起广泛可用(2004 年 9 月)
工作原理
Runtime.exec(String) 会按照 Java 的命令字符串分词规则拆分命令,当参数包含空格或引号时很容易被误解。ProcessBuilder 将程序参数作为彼此独立的值接收,并显式暴露工作目录、环境变量、输入/输出重定向以及错误流策略。除非应用有意启动 shell,否则它不会调用 shell。
相关文档
证明