Java 执行 Shell

在现代软件开发中,我们经常需要与操作系统的命令行界面进行交互。在 Java 开发中,我们可以使用 Java 提供的 Runtime 类或 ProcessBuilder 类来执行 Shell 命令。本文将介绍如何在 Java 中执行 Shell 命令,并提供一些示例代码。

1. 使用 Runtime 类执行 Shell 命令

Runtime 类是 Java 提供的一个用于执行系统命令的类。通过调用 Runtime.getRuntime().exec(command) 方法,我们可以在 Java 中执行 Shell 命令。以下是一个简单的示例,演示了如何使用 Runtime 类执行 Shell 命令并获取命令的输出:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ShellCommandExample {
    public static void main(String[] args) {
        try {
            // 执行命令
            Process process = Runtime.getRuntime().exec("ls -l");

            // 获取命令输出流
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            // 读取输出
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完毕
            int exitCode = process.waitFor();
            System.out.println("命令执行结果:" + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们使用 Runtime.getRuntime().exec("ls -l") 执行了一个简单的 ls -l 命令,并通过 InputStream 读取了命令的输出。需要注意的是,exec() 方法会返回一个 Process 对象,我们可以通过这个对象获取命令的输出流、错误流等。

2. 使用 ProcessBuilder 类执行 Shell 命令

除了 Runtime 类,Java 还提供了 ProcessBuilder 类来执行系统命令。相比 Runtime 类,ProcessBuilder 类更加灵活,可以更好地处理命令的参数、工作目录等。以下是一个使用 ProcessBuilder 类执行 Shell 命令的示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

public class ShellCommandExample {
    public static void main(String[] args) {
        try {
            // 构建命令
            ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");

            // 设置工作目录
            processBuilder.directory("/path/to/directory");

            // 执行命令
            Process process = processBuilder.start();

            // 获取命令输出流
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            // 读取输出
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完毕
            int exitCode = process.waitFor();
            System.out.println("命令执行结果:" + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们首先使用 ProcessBuilder 的构造函数指定了要执行的命令和参数,然后通过 directory() 方法设置了工作目录。最后,通过 start() 方法执行命令,并通过 Process 对象获取命令的输出流。

3. 处理命令的输出和错误流

在执行 Shell 命令时,除了获取命令的输出流之外,我们还可以获取命令的错误流。这样可以更全面地处理命令的结果。以下是一个示例代码,演示了如何同时获取命令的输出流和错误流:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ShellCommandExample {
    public static void main(String[] args) {
        try {
            // 执行命令
            Process process = Runtime.getRuntime().exec("ls -l");

            // 获取命令输出流
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            // 获取命令错误流
            InputStream errorStream = process.getErrorStream();
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));

            // 读取输出
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 读取错误
            String errorLine;
            while ((errorLine = errorReader