Продолжаем цикл статей для начинающих материалом о классе 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
Добрый день, меня интересует можно ли сделать чтобы сканер принимал в себя переменную с определенной строкой и прежде чем присвоить ее другой переменной, позволял ее в ручную редактировать?
сколько смотрю нихрена непонимаю откуда что береться и нафиг єтот сканнер нужен