java如何启动进程
启动进程的方法
在Java中启动外部进程可以通过Runtime类或ProcessBuilder类实现。这两种方式各有特点,适用于不同场景。
使用Runtime.exec()
Runtime.exec()是传统的启动进程方法,适用于简单的命令调用。以下是示例代码:
String command = "notepad.exe";
Process process = Runtime.getRuntime().exec(command);
// 获取进程输出流
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);
使用ProcessBuilder
ProcessBuilder提供了更灵活的控制,适合复杂场景:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "dir");
builder.redirectErrorStream(true); // 合并错误流和输出流
Process process = builder.start();
// 处理输出
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
reader.lines().forEach(System.out::println);
}
int exitCode = process.waitFor();
System.out.println("Exit value: " + exitCode);
处理输入输出流
启动进程后需要正确处理输入输出流,避免阻塞:
Process process = new ProcessBuilder("command").start();
// 单独线程处理输出流
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
reader.lines().forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 单独线程处理错误流
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getErrorStream()))) {
reader.lines().forEach(System.err::println);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
设置工作目录和环境变量
通过ProcessBuilder可以设置工作目录和环境变量:

ProcessBuilder builder = new ProcessBuilder("command");
builder.directory(new File("/path/to/workdir"));
Map<String, String> env = builder.environment();
env.put("KEY", "VALUE");
Process process = builder.start();
注意事项
启动外部进程时需要注意资源清理,确保调用process.destroy()或process.destroyForcibly()来终止进程。
对于长时间运行的进程,建议实现超时机制:
if (!process.waitFor(30, TimeUnit.SECONDS)) {
process.destroy();
if (!process.waitFor(10, TimeUnit.SECONDS)) {
process.destroyForcibly();
}
}






