我正在尝试从java应用程序运行.exe文件,并且希望能够使用它(现在),就像我可以写入.exe的终端,然后在再次写入之前从它读回来。
我的问题是代码仅在读者尝试从输入流读取之前关闭编写器时才有效。
String line = "", prev = "";
Scanner scan = new Scanner(System.in);
ProcessBuilder b = new ProcessBuilder("myexe");
b.redirectErrorStream(true);
Process p = b.start();
OutputStream stdin = p.getOutputStream();
InputStream stdout = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
System.out.println ("->");
while (scan.hasNext()) {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
String input = scan.nextLine();
if (input.trim().equals("exit")) {
writer.write("C");
} else {
writer.write(input);
}
writer.flush();
//writer.close();
while ((line = reader.readLine ()) != null) {
System.out.println ("[Stdout] " + line);
if (line.equals(prev)){
break;
}
prev = line;
}
reader.close();
}
所以我的问题是,我是否在使用ProcessBuilder做错了什么?我读过关于不正确读取输出会导致系统挂起的问题。但这并没有解释为什么当作家仍然开放时它会挂起?
答案 0 :(得分:1)
问题实际上是我的C编译.exe。当它运行时,应用程序正在打印输出,因此在cmd终端中工作,但是在发送每个命令后我没有刷新缓冲区。一旦我完成了这个,java应用程序会在发送它们时识别每个命令。