我有一个等待键击退出的命令行应用程序。这个过程从Java开始很好,但是当我发送击键(a)时,没有任何反应。看起来应用程序永远不会从stdin接收任何内容。这是一个代码示例:
Process p = Runtime.getRuntime().exec("\"C:\\app.exe\"");
Thread.sleep(5000);
OutputStream out = p.getOutputStream();
out.write(97);
out.flush();
out.close();
p.waitFor();
如果我只是从命令行执行它,它工作正常。有谁知道问题可能是什么?
谢谢!
答案 0 :(得分:2)
您需要读取两个流,getInputStream和getErrorStream,否则您的程序可能会永久阻止,请参阅JavaDoc
创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护程序进程,Microsoft Windows上的Win16 / DOS进程或shell脚本。创建的子进程没有自己的终端或控制台。其所有标准io(即stdin,stdout,stderr)操作将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。父进程使用这些流向子进程提供输入并从子进程获取输出。由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。