2017-02-28 46 views
0

我有一个客户/服务器游戏,用户轮流给游戏输入。我希望用户输入任何内容,而不会被忽略。我只想扫描用户提示后的输入。我正在使用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(); 
+0

没有使用无缓冲的终端io(使用本机库)来做你想做的事的方法。 –

+0

@ElliottFrisch嗯我认为有办法做到这一点,因为这是一项家庭作业的具体要求。多谢 – 3802400

+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); 

然而,这会如果您尝试访问抛出IllegalStateExceptionScanner关闭后。为了解决这个问题,尝试(关于Java 7和更高版本)的尝试,与资源块:

//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功能,因此可能是您的问题所需的答案。

+0

你的第一个建议是我最初尝试的,它导致我的程序挂起。您在第一次使用扫描器后调用in.nextLine()时,显示的try块会给出“java.util.NoSuchElementException:No line found”。 – 3802400

+0

它适用于我,只使用这个基本的代码。如果你得到这个异常,把有问题的行包装在'while(in.hasNextLine())'块中。你是否在不同的线程上运行代码?由于'nextLine()'是一个阻塞调用,因此在输入下一行之前可以读取其他代码是令人惊讶的。 – MikaelF

+0

我的不好,System.in与try-with-resources不兼容。给我一点时间来更新我的答案。 – MikaelF