我有一个 EXE 文件addOne.exe
,它会在控制台(NOT命令行参数)<持续获取用户的整数输入< / strong>并将整数+ 1 输出到控制台。样本输出如下所示:
1
2
6
7
29
30
...
我已经使EXE输出工作,也就是说,只要EXE将文本输出到控制台,就从 Java程序打印该文本。 我想:
Scanner.nextInt()
从 Java程序获取用户输入,并输入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。
修改:请参阅下面的答案
答案 0 :(得分:0)
切换try
和while
语句的范围,这样您只能生成1 BufferedWriter
。当您的资源尝试代码块结束时,编写器将关闭,并且扩展名stdin
也是如此。因此,不能再为该对象制作作者。
try([resources]) {
while([condition]) {
...
}
} catch(IOException ex) {
...
}
答案 1 :(得分:0)
似乎使用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);
}
}