Java 通过ProcessBuilder或Runtime.exec()调用(cmd/sh)系统命令方法代码
时间:2022-09-03
1、操作系统判断
boolean isWindows = System.getProperty("os.name")
.toLowerCase().startsWith("windows");
2、读取调用命令的输出
输出(Output)必须被读取,否则我们的进程将挂起,不能成功返回。
通过StreamGobbler
类来读取InputStream
:
private static >StreamGobbler implements Runnable {
private InputStream inputStream;
private Consumer<String> consumer;
public StreamGobbler(InputStream inputStream, Consumer<String> consumer) {
this.inputStream = inputStream;
this.consumer = consumer;
}
@Override
public void run() {
new BufferedReader(new InputStreamReader(inputStream)).lines()
.forEach(consumer);
}
}
3、使用Runtime.exec()调用cmd命令和shell命令并将结果输出到控制台
String homeDirectory = System.getProperty("user.home");
Process process;
if (isWindows) {
process = Runtime.getRuntime()
.exec(String.format("cmd.exe /c dir %s", homeDirectory));
} else {
process = Runtime.getRuntime()
.exec(String.format("sh -c ls %s", homeDirectory));
}
StreamGobbler streamGobbler =
new StreamGobbler(process.getInputStream(), System.out::println);
Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
assert exitCode == 0;
4、使用ProcessBuilder调用cmd命令和shell命令并将结果输出到控制台
对于有些复杂的处理,可以使用ProcessBuilder
,使用它可以:
- 使用
builder.directory()
更改我们的shell命令正在运行的工作目录 - 使用
builder.environment()
将自定义键值映射设置为环境变量 - 将输入和输出流重定向到自定义替换
- 使用
builder.inheritIO()
将它们都继承到当前JVM进程的流
ProcessBuilder builder = new ProcessBuilder();
if (isWindows) {
builder.command("cmd.exe", "/c", "dir");
} else {
builder.command("sh", "-c", "ls");
}
builder.directory(new File(System.getProperty("user.home")));
Process process = builder.start();
StreamGobbler streamGobbler =
new StreamGobbler(process.getInputStream(), System.out::println);
Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
assert exitCode == 0;
参考文档:https://www.baeldung.com/run-shell-command-in-java
特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。