exec.getInputStream() 阻塞了怎么办
时间: 2023-12-27 08:52:27 浏览: 65
当调用 `exec.getInputStream()` 时,如果没有数据可读,它会阻塞当前线程。如果你的程序需要继续执行而不是等待输入流,可以尝试以下解决方案:
1. 使用 `ProcessBuilder` 来运行外部进程,并使用 `redirectOutput` 方法将其输出重定向到文件或管道中,以便你可以异步读取输出。
```
ProcessBuilder pb = new ProcessBuilder("command", "arg1", "arg2");
File log = new File("log.txt");
pb.redirectErrorStream(true);
pb.redirectOutput(log);
Process p = pb.start();
```
2. 在单独的线程中异步读取输入流:
```
Process p = Runtime.getRuntime().exec(command);
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
```
3. 如果你需要等待进程完成并且需要处理其输出,可以使用 `Process.waitFor()` 方法来等待进程完成,并使用 `Process.getInputStream()` 方法来读取其输出。这个方法也会阻塞当前线程,但是你可以在等待进程完成时同时处理输出。
```
Process p = Runtime.getRuntime().exec(command);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
int exitCode = p.waitFor();
System.out.println("Process exited with code " + exitCode);
```
阅读全文