java如何执行exe
执行外部exe文件的方法
在Java中执行外部exe程序可以通过Runtime类或ProcessBuilder类实现。以下是两种主要方法:
使用Runtime.exec()
try {
Process process = Runtime.getRuntime().exec("C:\\path\\to\\program.exe");
// 获取进程输出流
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
try {
ProcessBuilder builder = new ProcessBuilder("C:\\path\\to\\program.exe", "arg1", "arg2");
builder.redirectErrorStream(true); // 合并错误流和输出流
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();
}
参数传递和路径处理
执行exe时可以传递参数,路径中包含空格时需要特殊处理:
// 带参数执行
Process process = Runtime.getRuntime().exec(new String[]{"C:\\Program Files\\app\\app.exe", "param1", "param2"});
// 或者使用ProcessBuilder
ProcessBuilder builder = new ProcessBuilder("\"C:\\Program Files\\app\\app.exe\"", "param1", "param2");
处理进程输出
为避免进程阻塞,必须处理进程的输出流和错误流:
Process process = Runtime.getRuntime().exec("program.exe");
StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream(), "OUTPUT");
StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");
outputGobbler.start();
errorGobbler.start();
其中StreamGobbler是一个继承Thread的类,用于异步读取流:

private static class StreamGobbler extends Thread {
private InputStream inputStream;
private String type;
public StreamGobbler(InputStream inputStream, String type) {
this.inputStream = inputStream;
this.type = type;
}
@Override
public void run() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(type + "> " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意事项
- 路径最好使用绝对路径,相对路径可能因工作目录不同而失效
- 处理流时应使用单独的线程,避免进程阻塞
- 考虑添加超时机制,防止进程长时间挂起
- 在Windows系统中注意路径分隔符使用双反斜杠或正斜杠
- 需要处理可能抛出的
IOException和InterruptedException






