Основная задача класса Scanner в Java состоит в том, чтобы сканировать полученные данные. Источники этих данных могут быть самые разнообразные, файлы, ввод с консоли или даже строки.
Базовый функционал класса легко умеет отделять такие примитивные типы как byte, short, float, String и другие.
Сканирование происходит при помощи поиска разделителя или так называемоего токена. Также в дело могут быть применены регулярные выражение, для которых в классе Scanner существуют определенные методы.
Токен может быть представлен любым из символом: пробел, табуляция или любым другим символом. Также и разделитель строк зачастую представлен символом перевода строки “Enter”.
Обзор основного функционала класса Scanner в Java
Как и было описано ранее, класс scanner содержит множество методов для работы с примитивными типами. Также существуют дополнительно служебные методы проверки наличия данных, например:
hasNextLine() — проверяет если в наличии новая строка для считывания.
hasNextInt() — проверка есть ли в наличии новое целое число для считывания.
При ошибках чтения данных могут возникать следующие исключения:
InputMismatchException — несоотвествие типов входящих данных. Часто возникает из-за ошибочно выбранной локализации.
IllegalStateException — возникает при ошибочном чтении с помощью регулярных выражений.
Пример использования в Java Scanner класса
В данном примере мы рассмотрели три варианта входящих данных: консольные данные, данные из файла, данные из строки.
- Где в консоли мы принимали разные типы данных. В конце в результате мы сделали вывод данных для наглядного отображения.
- В примере с файлом мы использовали две строки для того, чтобы отобразить возможность работать с текстом построчно.
- Также мы привели пример работы сканера со строками. В результате строка была преобразована в новый формат с разделителем -.
- Самым последним добавлен пример работы с регулярными выражениями.
Коментарии к коду специально объяснют функционал и результирующие данные. См. в блоке код.
class TestScanner {
public static void main(String[] args) {
systemInScan(); // Scan system inpu
fileScan(); // Scan file input
stringScan(); // Scan string
regexScan();
}
private static void systemInScan() {
Scanner systemInScanner = new Scanner(System.in);
int integerValue = systemInScanner.nextInt();
long longValue = systemInScanner.nextLong();
float floatValue = systemInScanner.nextFloat();
double doubleVar = systemInScanner.nextDouble();
String stringValue = systemInScanner.next();
systemInScanner.close();
System.out.println("Example of test input:");
System.out.println("integerValue:" + integerValue);
System.out.println("longValue:" + longValue);
System.out.println("floatValue:" + floatValue);
System.out.println("doubleVar:" + doubleVar);
System.out.println("stringValue:" + stringValue);
/*
1
2
3.3
4.4
Test
Example of test input:
integerValue:1
longValue:2
floatValue:3.3
doubleVar:4.4
stringValue:Test
*/
}
private static void fileScan() {
/* file content: test.txt
Пример первой строки
Пример второй строки
*/
try {
Scanner fileScanner = new Scanner(new FileReader("test.txt"));
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
System.out.println(line);
}
fileScanner.close();
/* Output:
Пример первой строки
Пример второй строки
*/
} catch (FileNotFoundException e) {
System.out.println("File not found");
}
}
private static void stringScan() {
Scanner stringScanner = new Scanner("1 2 3 4 5 6 7 8");
StringBuilder sb = new StringBuilder();
while (stringScanner.hasNext()) {
sb.append(stringScanner.nextInt());
sb.append("-");
}
stringScanner.close();
System.out.println(sb.toString());
/* Output:
1-2-3-4-5-6-7-8-
*/
}
private static void regexScan() {
String s = "white cat smoky cat red cat black cat";
Scanner scanner = new Scanner(s);
scanner.findInLine("(\\w+) cat (\\w+) cat (\\w+) cat (\\w+)");
MatchResult match = scanner.match();
for (int i = 1; i <= match.groupCount(); i++)
System.out.println(match.group(i));
/* Output:
white
smoky
red
black
*/
scanner.close();
}
}
Пример работы сканера с регулярными выражениями
Сканер также содержит методы, которые помогают работать с регулярными выражениями и выборочно находить нужные данные из источника.
В данном примере мы находим всех котов, которые присутствуют в строке.
String s = "white cat smoky cat red cat black cat";
Scanner scanner = new Scanner(s);
scanner.findInLine("(\\w+) cat (\\w+) cat (\\w+) cat (\\w+)");
MatchResult match = scanner.match();
for (int i = 1; i <= match.groupCount(); i++)
System.out.println(match.group(i));
/* Output:
white
smoky
red
black
*/
scanner.close();
С помощью класса Scanner очень легко можно обрабатывать/сканировать разнообразные типы данных. Буквально несколько строк кода могут автоматизировать целый процесс извлеченния данных из разных источников.