java如何调用cmd
调用CMD命令的方法
在Java中可以通过Runtime或ProcessBuilder类执行CMD命令。以下是两种常见实现方式:
使用Runtime.exec()
try {
// 执行单条命令
Process process = Runtime.getRuntime().exec("cmd /c 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("Exited with code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
cmd /c表示执行后关闭CMD窗口- 需要处理输入/错误流避免进程阻塞
使用ProcessBuilder(推荐)
try {
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "ping 127.0.0.1");
builder.redirectErrorStream(true); // 合并错误流到标准输出
Process process = builder.start();
// 读取输出
try (InputStream input = process.getInputStream();
Scanner scanner = new Scanner(input)) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
int exitCode = process.waitFor();
System.out.println("Exit value: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
- 支持更复杂的参数设置
- 可重定向输入输出流
- 提供更好的环境变量控制
注意事项
-
复杂命令建议使用数组形式传递参数:
new ProcessBuilder(new String[]{"cmd", "/c", "echo", "Hello World"}) -
需要管理员权限的命令:
// 通过runas命令提权 ProcessBuilder builder = new ProcessBuilder( "cmd.exe", "/c", "runas /user:Administrator \"mycommand\""); -
长时间运行命令需异步处理输出流,避免线程阻塞
-
Windows和Linux命令差异:
// Linux/Mac Process process = Runtime.getRuntime().exec("/bin/sh -c ls");
常见问题解决
-
中文乱码:指定控制台编码
BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream(), "GBK")); -
命令不执行:检查命令路径是否包含空格,需用引号包裹
Runtime.getRuntime().exec("cmd /c \"\"C:\\Program Files\\demo.bat\"\""); -
权限不足:以管理员身份运行Java程序







