在Java程序中调用DOS命令(Windows系统)或Shell命令(Linux/Unix系统)是一项常见的需求,通常用于执行系统级操作,如文件管理、进程控制或第三方工具调用,本文将详细介绍Java调用DOS命令的实现方法、注意事项及最佳实践,帮助开发者安全高效地完成相关任务。

核心实现:使用Runtime类
Java提供了Runtime类作为与操作系统交互的入口,其exec()方法是执行系统命令的核心,该方法支持多种重载形式,可根据命令复杂度选择合适的调用方式,以下为基本使用步骤:
-
获取Runtime实例
Runtime类采用单例模式,通过getRuntime()方法获取唯一实例:Runtime runtime = Runtime.getRuntime();
-
执行命令
调用exec(String command)方法执行简单命令,例如执行dir列出当前目录文件:Process process = runtime.exec("cmd /c dir");注意:Windows环境下需通过
cmd /c启动命令行解释器,/c表示执行后关闭窗口;若需保持窗口开启,可使用/k参数。 -
处理命令输出
Process对象提供了输入流(getInputStream())和错误流(getErrorStream()),用于获取命令执行结果和错误信息,需通过线程或异步方式读取流,避免阻塞主线程:
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } }
进阶方法:ProcessBuilder类
对于复杂命令或需要管理环境变量的场景,推荐使用ProcessBuilder类,相比Runtime,它提供了更灵活的配置选项:
-
构建命令列表
ProcessBuilder以列表形式接收命令参数,避免字符串解析问题:List<String> command = Arrays.asList("cmd", "/c", "ping", "www.baidu.com"); ProcessBuilder pb = new ProcessBuilder(command); -
设置工作目录与环境变量
可通过directory(File dir)指定命令执行路径,environment()修改环境变量:pb.directory(new File("C:\\Temp")); // 设置工作目录 Map<String, String> env = pb.environment(); env.put("PATH", env.get("PATH") + ";C:\\CustomPath"); // 添加自定义路径 -
合并错误流与标准输出
调用redirectErrorStream(true)可将错误流合并到标准输出,简化结果处理:pb.redirectErrorStream(true); Process process = pb.start();
关键注意事项
-
异常处理
exec()方法可能抛出IOException,需捕获并处理异常;同时需检查命令退出码(process.waitFor()),确保命令执行成功:
int exitCode = process.waitFor(); if (exitCode != 0) { System.err.println("命令执行失败,退出码: " + exitCode); } -
资源释放
Process对象需显式关闭,避免资源泄漏,建议使用try-with-resources语句管理流资源:try (Process process = runtime.exec("cmd /c dir")) { // 处理输出 } catch (IOException e) { e.printStackTrace(); } -
安全风险防范
直接拼接用户输入执行命令可能导致命令注入攻击,需对输入参数进行校验或转义,避免使用动态拼接的命令字符串。
实战案例:执行批处理文件
假设需调用批处理文件test.bat为echo Hello, World!,可通过以下代码实现:
public class ExecuteBatch {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "test.bat");
pb.directory(new File("C:\\Scripts")); // 批处理文件所在目录
pb.redirectErrorStream(true);
Process process = pb.start();
try (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("退出码: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
Java调用DOS命令主要通过Runtime和ProcessBuilder实现,后者在复杂场景下更具优势,开发者需注意异常处理、资源释放及安全问题,确保命令执行的稳定性和安全性,对于高频调用或复杂交互场景,可考虑使用第三方库(如Apache Commons Exec)简化开发流程,通过合理选择方法和规范编码,可有效提升系统命令调用的可靠性与可维护性。
















