Продолжаем цикл статей для начинающих материалом о классе Scanner. Сделаем краткий обзор и посмотрим на примере наиболее используемые методы.
Краткий обзор класса Scanner в Java
Класс Scanner используется для получения (считывания) данных введенных пользователем в виде String, byte, short, int, long, float, double.
Сканер выполняет поиск токенов во входной строке.
Токен (или маркер) представляет собой серию цифровых или буквенно-цифровых символов, которая заканчивается разделителем. Разделителем может быть символ табуляции, возврат каретки (перевод строки или же просто ‘Enter’), конец файла или пробел.
Пример: если пользователем был введен ряд чисел с пробелами между каждым номером, то класс Scanner будет принимать все номера в качестве отдельного токена. В этом случае пробельные символы выступают в качестве разделителей.
Пример использования Scanner в Java
Класс Scanner предоставляется с множеством конструкторов, например:
|
1 2 3 4 |
Scanner scanner = new Scanner(System.in); // получаем InputStream Scanner fileScanner = new Scanner(new FileReader("передаем сюда имя файла")); Scanner stringScanner = new Scanner("здесь строка"); // получаем сканер со строки ... |
Второй конструктор бросает FileNotFoundException.
Давайте рассмотрим академические примеры работы с каждым из них:
1). Считываем примитивные типы данных и строку:
|
1 2 3 4 5 6 |
Scanner scanner = new Scanner(System.in); int integerVar = scanner.nextInt(); // 22 long longVar = scanner.nextLong(); // 1000000 float realVar = scanner.nextFloat(); // 1,23 double doubleVar = scanner.nextDouble(); // 1,254 String string = scanner.next(); // test |
Обратите внимание, что при считывании float и double может быть выброшен InputMismatchException. Это говорит о том, что было введено значение, которое не распозналось как float или double.
Почему так происходит? Все дело в локали, а еще точнее — в знаке, который отделяет целую часть от остатка. В нашем случае мы вводили значение с запятой: 1,23 и проблем не было, однако попытка ввода такого значения: 1.23 приведет к вышеупомянутой ошибке.
Как избежать этого? Достаточно просто указать для Scanner‘а локаль:
|
1 2 |
Scanner scanner = new Scanner(System.in); scanner.useLocale(Locale.US); |
И теперь можно считывать float и double значения с точкой в виде 1.231.
Также ситуации с InputMismatchException можно избежать используя методы:
boolean hasNextLine(): вернетtrueесли у сканера есть следующая входная строка, иначе —false;
boolean hasNextInt(): вернетtrueесли следующим токеном сканера является значение типаint;
boolean hasNextFloat(): вернетtrueесли следующим токеном сканера является значение типаfloat;
2). Вторым академическим примером является обработка файла с помощью Scanner
Он располагает двумя методами для считывания данных:
- .hasNext();
- .hasNextLine();
Они возвращают true, если в файле есть еще токен.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static void main(String[] args) { File file = new File("test.txt"); try { Scanner scanner = new Scanner(file); // обрабатываем файл пока в нем еще есть токен // в данном случае - есть ли новая строка while (scanner.hasNextLine()) { String line = scanner.nextLine(); // печатаем построчно System.out.println(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } } |
Как видите, классом Scanner очень удобно обрабатывать различные источники информации — будь-то файлы, потоки ввода или строки.




«Дробная часть числа» — это иное понятие, нежели понятие «остаток».
Цитата:
Почему так происходит? Все дело в локали, а еще точнее — в знаке, который отделяет целую часть от ОСТАТКА.
остаток от деления на 10
Добрый день, меня интересует можно ли сделать чтобы сканер принимал в себя переменную с определенной строкой и прежде чем присвоить ее другой переменной, позволял ее в ручную редактировать?
сколько смотрю нихрена непонимаю откуда что береться и нафиг єтот сканнер нужен