专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java调用shell脚本的方法

Java调用shell脚本的方法

更新时间:2022-07-04 12:10:13 来源:星辉 浏览6854次

Java调用shell脚本的方法是什么?星辉小编来告诉大家。

1.概述

在本教程中,我们将说明在Java代码中执行 shell 命令的两种方式。

第一种是使用Runtime类并调用它的exec方法。

第二种更可定制的方式是创建和使用ProcessBuilder实例。

2.操作系统依赖

在我们要创建一个执行我们的 shell 命令的新进程之前,我们需要首先确定我们的JVM正在运行的操作系统。

这是因为,在Windows上,我们需要将命令作为cmd.exe shell 的参数运行,而在所有其他操作系统上,我们可以发出标准 shell,称为sh:

boolean isWindows = System.getProperty("os.name")
  .toLowerCase().startsWith("windows");

3.输入输出

此外 ,我们需要一种方法来挂钩我们流程的输入和输出流。

至少必须消耗输出- 否则我们的进程不会成功返回,而是会挂起。

让我们实现一个名为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 执行。

4.运行时.exec()

对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;

5.流程构建器

对于计算问题的第二个实现,我们将使用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星辉在线学习,里面的课程内容细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>