在 Java 中处理初始值后不要关闭 stdin。



我正在制作一个简单的控制台应用程序。我的主循环看起来像这样。

var s = new Scanner(System.in);
while (appShouldRun) {
var action = s.nextLine();
// proccess action
}

当我用空的stdin运行应用程序时,它工作得很好。

java -jar app.jar

但我想把一些准备好的场景归档。运行它们,然后等待下一个用户输入。

预期行为:

java -jar app.jar < scenario.txt
output of commands from file
| <- cursor, waiting for user input
// scenario.txt
cmd1
cmd2
cmd3
.
.
.

问题是,当我运行带有od-std的程序时,它会正确地处理命令,但随后会抛出

java.util.NoSuchElementException: No line found

我认为这是因为在处理完文件中的所有行之后,stdin被关闭了。我错了吗?如何修复代码以获得预期行为?

感谢

使用<重定向标准输入时,它连接到输入文件,而根本没有连接到控制台

如果您希望程序在控制台上接收输入,那么就不能重定向stdin。您应该将文件名作为命令行参数。打开它,读取它,关闭它,然后处理stdin。

或者,如果你真的想,并且你在unix/linux/macOS系统上,你可以这样运行它,使用cat命令将标准输入连接到其他东西:

cat scenario.txt - | java -jar app.jar

我尝试过尽可能少地更改代码。这会像你想要的那样读取整个文件,并在没有异常的情况下结束

public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
boolean appShouldRun = true;
while (appShouldRun) {
String action = s.nextLine();
System.out.println("got: " + action);
appShouldRun = s.hasNext();
}
}
}

最新更新