Java调用shell脚本的方法是什么?动力节点小编来告诉大家。
在本教程中,我们将说明在Java代码中执行 shell 命令的两种方式。
第一种是使用Runtime类并调用它的exec方法。
第二种更可定制的方式是创建和使用ProcessBuilder实例。
在我们要创建一个执行我们的 shell 命令的新进程之前,我们需要首先确定我们的JVM正在运行的操作系统。
这是因为,在Windows上,我们需要将命令作为cmd.exe shell 的参数运行,而在所有其他操作系统上,我们可以发出标准 shell,称为sh:
boolean isWindows = System.getProperty("os.name")
.toLowerCase().startsWith("windows");
此外 ,我们需要一种方法来挂钩我们流程的输入和输出流。
至少必须消耗输出- 否则我们的进程不会成功返回,而是会挂起。
让我们实现一个名为StreamGobbler的常用类,它使用InputStream:
private static class 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);
}
}
注意:这个类实现了Runnable接口,这意味着它可以被任何Executor 执行。
对Runtime.exec()的方法调用是一种简单的、尚未可定制的方法来生成新的子进程。
在以下示例中,我们将请求用户主目录的目录列表并将其打印到控制台:
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;
对于计算问题的第二个实现,我们将使用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;
通过上述介绍,相信大家对Java调用shell脚本的方法已经有所了解,大家如果想了解更多相关知识,可以关注一下动力节点的Java在线学习,里面的课程内容细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习