在 Java 中执行 Linux 命令行有多种方式,以下是一些常见的实现方式,包括步骤流程、依赖坐标和示例代码:
这是一种基本的方式,可以在 Java 中执行系统命令。然而,它有一些限制和安全风险,因此在使用时需要小心。
步骤流程:
Runtime.getRuntime().exec(command)
调用命令。Process
对象获取命令的输出流、错误流以及等待命令执行完成。示例代码:
public class RuntimeExecExample {
public static void main(String[] args) {
try {
String command = "ls -l"; // 你要执行的Linux命令
Process process = Runtime.getRuntime().exec(command);
// 获取命令输出流
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("Command exited with code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
ProcessBuilder
提供了更灵活的方式来执行命令,并且可以设置工作目录、环境变量等。
步骤流程:
ProcessBuilder
对象并指定命令及参数。start()
方法启动进程。Process
对象来获取输出流、错误流以及等待命令执行完成。示例代码:
public class ProcessBuilderExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");
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("Command exited with code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
对于以上两种方式,不需要额外的依赖库。
这是一个开源的库,用于更安全地执行外部命令。
Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
Gradle 依赖:
implementation 'org.apache.commons:commons-exec:1.3'
示例代码:
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteResultHandler;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.PumpStreamHandler;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class CommonsExecExample {
public static void main(String[] args) {
try {
String command = "ls -l";
CommandLine cmdLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
// 设置超时时间
ExecuteWatchdog watchdog = new ExecuteWatchdog(60000); // 60秒超时
executor.setWatchdog(watchdog);
// 设置命令输出处理
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
executor.setStreamHandler(streamHandler);
// 执行命令
int exitCode = executor.execute(cmdLine);
System.out.println("Command exited with code: " + exitCode);
// 打印命令输出
String output = outputStream.toString(StandardCharsets.UTF_8);
System.out.println("Command output:\n" + output);
} catch (ExecuteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是几种在 Java 中执行 Linux 命令的方式,每种方式都有其优缺点,请根据项目需求选择适合的方法。