你如何从Java程序连续输入到EXE的控制台?
How do you continuously input from Java program to EXE's console?
我有一个 EXE 文件,addOne.exe
它不断从控制台上的用户那里获取整数输入 (NOT command line parameters) 并将 integer + 1 输出到控制台。示例输出如下所示:
1
2
6
7
29
30
...
我已经使 EXE 输出工作,也就是说,每当 EXE 输出文本到控制台时,从 Java 程序 打印该文本。
我正在尝试:
- 使用
Scanner.nextInt()
从Java程序获取用户输入并作为控制台输入输入到EXE
- 我需要一次一个地发送输入,这意味着简单地在程序结束时关闭 BufferedWriter 流并将流一次性输入到 EXE 中是行不通的。
目前,我有以下代码:
Process process = Runtime.getRuntime().exec("D:\addOne.exe");
...
Scanner keyboard = new Scanner(System.in);
String input = "";
OutputStream stdin = process.getOutputStream();
while (!input.equals("exit")) {
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin))) {
input = keyboard.nextLine();
writer.write(input);
} catch (IOException ex) {
Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE,null,ex);
}
}
但是,每当我 运行 这段代码时,while 循环的第一次迭代(我第一次输入内容)能够将输入发送到 EXE,但是在第一次迭代之后,错误java.io.IOException: Stream Closed
给出。
如何在 while 循环
中继续从 Scanner.nextInt()
获取用户输入
谢谢。
编辑: writer.flush()
似乎没有将来自 Java 程序的用户输入输入到 EXE。
编辑:在下面查看我的回答
切换 try
和 while
语句的范围,这样您就只生成 1 个 BufferedWriter
。当您的 try-with-resources 代码块结束时,编写器将关闭,扩展 stdin
也是如此。因此,不能为该对象创建更多的编写器。
try([resources]) {
while([condition]) {
...
}
} catch(IOException ex) {
...
}
似乎使用 writer.flush() 将流输入到 EXE 中,但在输入被 EXE 处理之前流需要一个 writer.newLine(),因为控制台需要输入输入后要按下的键。
这是工作代码:
while (true) {
try {
input = keyboard.nextLine();
writer.write(input);
System.out.println("IN: "+input);
writer.newLine();
writer.flush();
} catch (IOException ex) {
Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
我有一个 EXE 文件,addOne.exe
它不断从控制台上的用户那里获取整数输入 (NOT command line parameters) 并将 integer + 1 输出到控制台。示例输出如下所示:
1
2
6
7
29
30
...
我已经使 EXE 输出工作,也就是说,每当 EXE 输出文本到控制台时,从 Java 程序 打印该文本。 我正在尝试:
- 使用
Scanner.nextInt()
从Java程序获取用户输入并作为控制台输入输入到EXE - 我需要一次一个地发送输入,这意味着简单地在程序结束时关闭 BufferedWriter 流并将流一次性输入到 EXE 中是行不通的。
目前,我有以下代码:
Process process = Runtime.getRuntime().exec("D:\addOne.exe");
...
Scanner keyboard = new Scanner(System.in);
String input = "";
OutputStream stdin = process.getOutputStream();
while (!input.equals("exit")) {
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin))) {
input = keyboard.nextLine();
writer.write(input);
} catch (IOException ex) {
Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE,null,ex);
}
}
但是,每当我 运行 这段代码时,while 循环的第一次迭代(我第一次输入内容)能够将输入发送到 EXE,但是在第一次迭代之后,错误java.io.IOException: Stream Closed
给出。
如何在 while 循环
中继续从Scanner.nextInt()
获取用户输入
谢谢。
编辑: writer.flush()
似乎没有将来自 Java 程序的用户输入输入到 EXE。
编辑:在下面查看我的回答
切换 try
和 while
语句的范围,这样您就只生成 1 个 BufferedWriter
。当您的 try-with-resources 代码块结束时,编写器将关闭,扩展 stdin
也是如此。因此,不能为该对象创建更多的编写器。
try([resources]) {
while([condition]) {
...
}
} catch(IOException ex) {
...
}
似乎使用 writer.flush() 将流输入到 EXE 中,但在输入被 EXE 处理之前流需要一个 writer.newLine(),因为控制台需要输入输入后要按下的键。
这是工作代码:
while (true) {
try {
input = keyboard.nextLine();
writer.write(input);
System.out.println("IN: "+input);
writer.newLine();
writer.flush();
} catch (IOException ex) {
Logger.getLogger(CmdLineTest.class.getName()).log(Level.SEVERE, null, ex);
}
}