如果 BufferedWriter 仍然打开,为什么 BufferedReader 会失败?
Why does BufferedReader fail if BufferedWriter is still open?
我正在尝试从 java 应用程序 运行 一个 .exe 文件,并希望能够(现在)像终端一样使用它,我可以在其中写入 .exe然后在再次写入之前从中读回。
我的问题是代码仅在 reader 尝试从输入流读取之前关闭编写器时才有效。
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 做错了什么?我读过有关不正确读取输出会导致系统挂起的信息。但这并不能解释为什么当编写器仍然打开时它会挂起?
问题实际上出在我的 C 编译的 .exe 上。当它是 运行 时,应用程序正在打印输出,因此在 cmd 终端中工作,但是我没有在发送每个命令后刷新缓冲区。完成此操作后,java 应用程序将在发送时识别每个命令。
我正在尝试从 java 应用程序 运行 一个 .exe 文件,并希望能够(现在)像终端一样使用它,我可以在其中写入 .exe然后在再次写入之前从中读回。
我的问题是代码仅在 reader 尝试从输入流读取之前关闭编写器时才有效。
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 做错了什么?我读过有关不正确读取输出会导致系统挂起的信息。但这并不能解释为什么当编写器仍然打开时它会挂起?
问题实际上出在我的 C 编译的 .exe 上。当它是 运行 时,应用程序正在打印输出,因此在 cmd 终端中工作,但是我没有在发送每个命令后刷新缓冲区。完成此操作后,java 应用程序将在发送时识别每个命令。