我正在制作一个简单的控制台应用程序。我的主循环看起来像这样。
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();
}
}
}