Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();
原文由 user590444 发布,翻译遵循 CC BY-SA 4.0 许可协议
Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();
原文由 user590444 发布,翻译遵循 CC BY-SA 4.0 许可协议
看来您在等待输出完成之前没有阅读输出。仅当输出未填满缓冲区时才可以。如果是,它将等到您读取输出 catch-22。
也许你有一些你没有阅读的错误。这将使应用程序停止并 waitFor 永远等待。一个简单的解决方法是将错误重定向到常规输出。
ProcessBuilder pb = new ProcessBuilder("tasklist");
pb.redirectErrorStream(true);
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null)
System.out.println("tasklist: " + line);
process.waitFor();
原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 2.5 许可协议
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.7k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
waitFor()
没有返回的原因有很多。但它通常归结为执行的命令没有退出的事实。
同样,这可能有很多原因。
一个常见的原因是进程产生了一些输出,而您没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待您的进程继续读取。您的进程依次等待另一个进程完成(它不会因为它等待您的进程,……)。这是典型的死锁情况。
您需要不断地从进程输入流中读取以确保它不会阻塞。
有一篇很好的文章解释了
Runtime.exec()
的所有陷阱,并展示了解决这些问题的方法,称为 “When Runtime.exec() won’t” (是的,该文章来自 2000 年,但内容仍然适用!)