如何清除Java中的扫描程序缓冲区?

时间:2012-05-15 15:36:00

标签: java io

我有这样的事情:

    Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");

如何清除缓冲区?

编辑:我尝试了以下内容,但由于某种原因它无效:

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

6 个答案:

答案 0 :(得分:28)

试试这个:

in.nextLine();

这使扫描仪进入下一行。

答案 1 :(得分:8)

您无法明确清除扫描仪的缓冲区。在内部,它可能会在读取令牌后清除缓冲区,但这是在porgrammers的范围之外的实现细节。

答案 2 :(得分:5)

这应该解决它......

Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            in.next(); // -->important
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");

答案 3 :(得分:5)

使用以下命令:

in.nextLine();

之后

System.out.println("Invalid input. Please Try Again.");
System.out.println();

或在以下大括号之后(关于它的评论)。

此命令使扫描器前进到下一行(当从文件或字符串中读取时,这只是读取下一行),因此在这种情况下基本上将其刷新。它清除缓冲区并准备扫描仪以获得新输入。当用户输入无效输入时(例如当被要求输入数字时的字母),它可以优选地用于清除当前缓冲区。

该方法的文档可在此处找到: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

希望这有帮助!

答案 4 :(得分:0)

其他人建议使用in.nextLine()清除缓冲区,该缓冲区适用于单行输入。但是,正如评论所指出的那样,有时System.in输入可以是多行。

如果使用的是System.in,而不是其他InputStream,则可以在其中清除缓冲区的地方创建一个新的Scanner对象。

in = new Scanner(System.in);

如果执行此操作,请不要先致电in.close()。这样做将关闭System.in,因此您随后在对in.nextInt(); System.in的调用中将获得NoSuchElementExceptions。

(上述方法特定于System.in。可能不适用于其他输入流。)

如果确实需要在创建新对象之前关闭Scanner对象,则this StackOverflow answer建议为System.in创建一个InputStream包装器,该包装器具有自己的close()方法,该方法不会关闭包装的System.in。流。不过,对于简单的程序来说,这太过分了。

答案 5 :(得分:-1)

scan.nextLine();

在读取字符串输入之前放置上面一行