Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何清除输入缓冲区以忽略提示前给出的输入?_Java_Io_Buffer_Java.util.scanner - Fatal编程技术网

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

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

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

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

在轮到玩家之前,你可以手动清空
扫描器
(我想你一直在做什么):

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

但是,如果您试图在扫描仪关闭后访问它,这将抛出一个非法状态异常。要解决此问题,请尝试(在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