Java如何使用DOS命令行
在Java程序中执行DOS命令行(Windows系统)或Shell命令(Linux/macOS系统)是一项常见需求,例如自动化系统操作、调用外部工具或管理文件系统,Java提供了Runtime类和ProcessBuilder类来实现这一功能,其中ProcessBuilder是更现代、更灵活的方式,本文将详细介绍这两种方法的使用场景、代码示例及注意事项。

使用Runtime类执行命令
Runtime类是Java中与操作系统交互的入口点,它提供了exec()方法来执行命令,该方法返回一个Process对象,可用于管理命令的执行过程。
基本用法
以下是一个简单的示例,执行dir命令列出当前目录文件:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class RuntimeExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("dir");
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("Exit Code: " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
- 命令参数处理:如果命令包含空格或特殊字符,建议使用字符串数组形式,例如
exec(new String[]{"cmd", "/c", "dir", "C:\\Users"})。 - 流管理:必须及时读取命令的输入流和错误流,否则可能导致进程阻塞。
- 异常处理:
exec()方法可能抛出IOException,需妥善处理。
使用ProcessBuilder类执行命令
ProcessBuilder是Java 5引入的类,相比Runtime类提供了更强大的功能,如重定向输入输出流、设置工作目录等。
基本用法
以下示例使用ProcessBuilder执行ping命令:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ProcessBuilderExample {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("ping", "www.baidu.com");
Process process = pb.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("Exit Code: " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
高级功能
- 重定向输入输出:
pb.redirectOutput(new File("output.txt")); // 将输出重定向到文件 pb.redirectErrorStream(true); // 合并错误流到输出流 - 设置工作目录:
pb.directory(new File("C:\\temp")); // 设置命令执行的工作目录
命令执行中的常见问题
- 阻塞问题:如果未及时读取命令的输出流或错误流,可能会导致进程无法正常结束,建议使用单独的线程处理输入流和错误流。
- 跨平台兼容性:Windows使用
cmd /c执行命令,而Linux/macOS使用sh -c,可通过System.getProperty("os.name")判断操作系统类型。 - 命令路径问题:如果命令不在系统PATH中,需提供完整路径,例如
C:\\Windows\\System32\\ping.exe。
安全与最佳实践
- 避免命令注入:不要直接拼接用户输入到命令中,应使用参数化方式传递参数。
String[] command = {"ping", userInput}; // 安全 String[] command = "ping " + userInput; // 危险,可能被注入 - 资源释放:确保调用
process.destroy()关闭进程,避免资源泄漏。 - 超时控制:使用
process.waitFor(long timeout, TimeUnit unit)设置命令执行超时时间。
Java通过Runtime和ProcessBuilder类提供了执行DOS命令的能力,其中ProcessBuilder功能更全面,推荐在新项目中优先使用,开发时需注意流管理、异常处理和安全问题,以确保程序稳定可靠,通过合理运用这些工具,可以轻松实现Java程序与操作系统的深度交互。


















