如何清除输入缓冲区以忽略提示前给出的输入?

时间:2017-02-28 04:15:17

标签: java io buffer java.util.scanner

我有一个客户端/服务器游戏,用户轮流为游戏提供输入。当轮到它被忽略时,我想要用户输入的任何内容。我想只扫描用户提示后输入的输入。我正在使用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();

1 个答案:

答案 0 :(得分:0)

无法禁用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);

但是,如果您在关闭后尝试访问IllegalStateException,则会抛出Scanner。要解决此问题,请尝试(在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功能,因此可能是您问题的必要答案。