【问题标题】:How can I clear the input buffer to ignore input given before prompt?如何清除输入缓冲区以忽略提示前给出的输入?
【发布时间】:2017-02-28 04:15:17
【问题描述】:

我有一个客户端/服务器游戏,用户轮流为游戏提供输入。我希望用户在轮到他们时输入的任何内容都被忽略。我只想扫描用户在提示后提供的输入。我正在使用 java.util.Scanner 进行输入,但我找不到在程序挂起的情况下“刷新”扫描仪缓冲区的方法。我也找不到其他输入阅读方法做我想做的事的例子。

这是我尝试过的:

Scanner in = new Scanner(System.in);
    //do game stuff
    //I don't care about anything typed at this time
while(in.hasNextLine()){
    in.nextLine();
}

System.out.println("Enter your move:");
String input = in.nextLine();

【问题讨论】:

  • 如果不使用无缓冲终端 io(使用本机库),就没有办法做你想做的事。
  • @ElliottFrisch 嗯,我认为有办法做到这一点,因为这是家庭作业的特定要求。不过谢谢
  • 这是一个多线程应用程序吗?你怎么知道什么时候轮到你?

标签: java io buffer java.util.scanner


【解决方案1】:

无法禁用 Scanner 并重新启用它。以下是一些建议:

您可以在轮到玩家之前手动清空Scanner,就像这样((我认为)您一直在做什么):

while(in.hasNext()) in.next();

或者,您可以在玩家回合结束时关闭扫描仪,并在下一回合开始时实例化一个新扫描仪(您无法重新打开已关闭的 Scanner):

//Player's turn
//
//End of player's turn...
in.close();

//Beginning of player's turn
in = new Scanner(System.in);

但是,如果您在关闭 Scanner 后尝试访问它,则会抛出 IllegalStateException。要解决这个问题,请尝试(在 Java 7 及更高版本上)try-with-resources 块:

//Overridden close method because you don't want to close System.in
try (Scanner in = new Scanner(new InputStreamReader(System.in)
    {public void close() throws IOException {}})) {
    System.out.println("Enter your move:");
    String input = in.nextLine();
}
//End of player's turn
//Scanner is automatically closed and this code is out of the scanner's scope

我认为最后一个选项是您最好的选择。它将Scanner 的范围限制为相关代码,并自动执行实例化/关闭。此外,它使用(相对)最新的 Java 功能,因此这可能是您问题的必要答案。

【讨论】:

  • 您的第一个建议是我最初尝试的,它导致我的程序挂起。你展示的 try 块在我第一次使用扫描仪后调用 in.nextLine() 时给出“java.util.NoSuchElementException: No line found”。
  • 它适用于我,只使用这个基本代码。如果您遇到该异常,请将违规行包含在 while(in.hasNextLine()) 块中。您是否在不同的线程上运行代码?由于nextLine() 是一个阻塞调用,令人惊讶的是,在输入下一行之前可以读取其他代码。
  • 我的错,System.in 不能很好地与 try-with-resources 配合使用。给我一点时间来更新我的答案。
  • 是的,这是多线程的,我认为这是给我带来如此多困难的原因。玩弄它似乎您的解决方案在单线程环境中工作,但我无法让它为我工作
  • @3802400 嗯,这完全是另一个问题,你的问题没有提到任何关于多线程的事情。 Scanner 不是线程安全的。见Is the scanner in java not thread safe?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多