it-swarm.com.ru

Как очистить буфер сканера в Java?

У меня есть что-то вроде этого:

    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();
21
Leo Jiang

Вы не можете явно очистить буфер сканера. Внутренне, он может очистить буфер после чтения токена, но это детали реализации за пределами досягаемости программистов.

8
Óscar López

Попробуй это:

in.nextLine();

Это продвигает сканер на следующую строку.

26
Makoto

Используйте следующую команду: 

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 ()

Надеюсь это поможет!

5
Gunnar Södergren

Это должно исправить это ...

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.");
5
rejun

Это работает для меня. Это не совсем надежно, потому что available () - это только оценка, но я просто хочу очистить большую часть ввода после того, как пользователь удерживал клавишу, чтобы она повторилась. Я не против получить одного или двух дополнительных персонажей.

        System.in.skip(System.in.available());
0
trindflo