Java通过Runtime类或ProcessBuilder类提供了调用CMD命令的能力。这两个类都允许Java程序启动一个新的进程并执行特定的命令,通过标准输入输出流进行数据交换。Runtime类适用于简单的命令执行,ProcessBuilder类则更加灵活,适用于复杂的命令和参数传递。
一、使用Runtime类调用CMD命令
Runtime类提供了exec()方法来执行CMD命令。该方法接收一个String类型的命令字符串,并返回一个Process对象,通过这个对象可以获取命令执行的结果。此方式历史最为悠久,使用也最广,使应用程序能够与其运行的环境相连接,但是在读取上还存在一些不便性,正常的输出流与错误流得分开读取。其他功能基本相同。在jdk8中 Runtime 底层也是通过 ProcessBuilder 实现
public class CmdExecutionExample {
public static void main(String[] args) {
try {
// 调用CMD命令
String command = "ping 127.0.0.1";
Process process = Runtime.getRuntime().exec(command);
// 获取命令输出结果
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待命令执行完成
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、使用ProcessBuilder类调用CMD命令
ProcessBuilder类相比Runtime类更加灵活,可以通过链式调用设置命令和参数,同时还可以设置工作目录、环境变量等。此为jdk1.5加入的,它没有将应用程序与其运行的环境相连接。这个就需要自己设置其相关的信息。但它提供了将正常流与流程流合并在一起的解决办法,只需要设置redirectErrorStream(错误流重定向到标准数据流)属性即可。
class CmdExecutionExample {
public static void main(String[] args) {
try {
// 调用CMD命令
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "set"); // /c参数表示执行后关闭CMD窗口
processBuilder.redirectErrorStream(true); // 将错误输出流与标准输出流合并
Process process = processBuilder.start();
// 获取命令输出结果
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待命令执行完成
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}