Java 如何清除输入缓冲区以忽略提示前给出的输入?
我有一个客户机/服务器游戏,用户轮流为游戏提供输入。当轮到用户时,我希望用户键入的任何内容都被忽略。我只想扫描用户在提示后给出的输入。我正在使用java.util.Scanner进行输入,但我找不到一种方法在程序挂起的情况下“刷新”扫描仪缓冲区。我也找不到其他输入阅读方法的例子来做我想做的事情 这就是我所尝试的:Java 如何清除输入缓冲区以忽略提示前给出的输入?,java,io,buffer,java.util.scanner,Java,Io,Buffer,Java.util.scanner,我有一个客户机/服务器游戏,用户轮流为游戏提供输入。当轮到用户时,我希望用户键入的任何内容都被忽略。我只想扫描用户在提示后给出的输入。我正在使用java.util.Scanner进行输入,但我找不到一种方法在程序挂起的情况下“刷新”扫描仪缓冲区。我也找不到其他输入阅读方法的例子来做我想做的事情 这就是我所尝试的: Scanner in = new Scanner(System.in); //do game stuff //I don't care about anything t
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();
无法禁用
扫描仪
并重新启用它。以下是一些建议:
在轮到玩家之前,你可以手动清空扫描器
(我想你一直在做什么):
或者,您可以在玩家回合结束时关闭扫描器,并在下一回合开始时实例化一个新扫描器(您不能重新打开关闭的扫描器
):
但是,如果您试图在扫描仪关闭后访问它,这将抛出一个非法状态异常。要解决此问题,请尝试(在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
我认为最后一个选择是你最好的选择。它将
扫描仪的范围限制为相关代码,并自动实例化/关闭。另外,它使用了(相对而言)最新的Java功能,因此这可能是您的问题的必要答案。如果不使用无缓冲的终端io(使用本机库),就没有办法做您想做的事情。@ElliottFrisch-Hmm我认为有办法做到这一点,因为这是家庭作业的特定要求。谢谢,这是一个多线程应用程序吗?你怎么知道什么时候轮到你了?你的第一个建议是我最初尝试的,它导致我的程序挂起。在我第一次使用扫描仪后调用.nextLine()时,您显示的try块给出了“java.util.NoSuchElementException:No line found”。它对我很好,只使用了这段基本代码。如果遇到该异常,请在while(in.hasNextLine())
块中包装有问题的行。您是否在不同的线程上运行代码?由于nextLine()
是一个阻塞调用,因此在输入下一行之前可以读取其他代码是令人惊讶的。我的错误,System.in不能很好地使用try with resources。给我一点时间更新我的答案。是的,这是多线程的,我认为这是造成我这么多困难的原因。在单线程环境中,您的解决方案似乎可以正常工作,但我无法让它正常工作me@3802400这是另一个问题,你的问题没有提到任何关于多线程的问题<代码>扫描仪
不是线程安全的。看见
//Player's turn
//
//End of player's turn...
in.close();
//Beginning of player's turn
in = new Scanner(System.in);
//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