java如何运行命令
运行系统命令的方法
在Java中运行系统命令可以通过Runtime类或ProcessBuilder类实现。这两种方式都能启动外部进程并执行命令。
使用Runtime.exec()
Runtime.getRuntime().exec()是最基础的方法,直接执行传入的命令字符串:

try {
Process process = Runtime.getRuntime().exec("ls -l");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("Exited with code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
使用ProcessBuilder
ProcessBuilder提供了更灵活的控制,如设置工作目录和环境变量:
try {
ProcessBuilder builder = new ProcessBuilder("ls", "-l");
builder.directory(new File("/path/to/dir"));
Process process = builder.start();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("Exited with code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
处理输入输出流
命令执行后需要通过getInputStream()、getErrorStream()和getOutputStream()管理进程的输入输出:

Process process = Runtime.getRuntime().exec("command");
BufferedReader stdInput = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(
new InputStreamReader(process.getErrorStream()));
String output;
while ((output = stdInput.readLine()) != null) {
System.out.println(output);
}
while ((output = stdError.readLine()) != null) {
System.err.println(output);
}
等待进程结束
使用waitFor()方法会阻塞当前线程直到命令执行完成,可通过exitValue()获取退出码:
Process process = Runtime.getRuntime().exec("command");
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("Command executed successfully");
} else {
System.out.println("Command failed with code: " + exitCode);
}
超时控制
为防止长时间阻塞,可以通过Future实现超时控制:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(() -> {
try {
Process process = Runtime.getRuntime().exec("command");
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
});
try {
future.get(30, TimeUnit.SECONDS);
} catch (TimeoutException e) {
future.cancel(true);
System.out.println("Command timed out");
}
executor.shutdownNow();
注意事项
- 复杂命令建议使用
ProcessBuilder拆分参数,避免shell注入风险 - 必须消费进程的输出流,否则可能导致进程阻塞
- 跨平台时注意命令差异,Windows和Linux的命令语法不同
- 敏感操作需进行权限检查






