Java Scanner class является частью пакета java.util. Он был введен в релизе Java 1.5. Сканер в основном используется для получения пользовательского ввода и его разбора на примитивные типы данных, такие как int, double или строку по умолчанию. Это утилитарный класс для разбора данных с использованием регулярных выражений путем генерации токенов.
Конструкторы класса Java Scanner
Если посмотреть на класс Scanner, там много конструкторов.

Большинство конструкторов используют один из трех объектов:
- InputStream – наиболее распространенный, где мы передаем System.in для получения пользовательского ввода.
- File или Path – Мы также можем сканировать данные из файла и работать со значениями из файла.
- String – Мы можем создать сканер для источника строк и разбирать значения из него.
Если посмотреть на второй аргумент, он предназначен для указания набора символов, если вы не хотите использовать символьный набор по умолчанию для разбора.
Важные методы класса Scanner
Давайте рассмотрим некоторые из наиболее часто используемых методов класса Scanner.
- useDelimiter(String pattern) – разделитель, который будет использоваться для сканера. Разделителем по умолчанию является пробел.
- hasNext() – возвращает true, если вводе есть еще один токен. Это блокирующий метод, который будет ждать ввода пользователя.
- next() – возвращает следующий токен из сканера. Используется с методом hasNext().
- close() – сканер требует много ресурсов, поэтому после завершения работы с ним используйте этот метод для его закрытия и освобождения системных ресурсов.
Существует много вспомогательных методов для проверки и прямого разбора входного токена в int, short, long, byte, BigDecimal и т. д.
Шаги по инициализации и использованию сканера
- Первый шаг – инициализировать класс сканера, используя соответствующий конструктор в зависимости от типа ввода, такого как InputStream, File или String. При необходимости установите разделитель и набор символов для использования.
- Второй шаг – ожидать ввод токена с помощью метода hasNext().
- Затем используйте метод next(), чтобы прочитать токен и обработать их один за другим.
Как работает сканер?
- Класс Scanner разбивает свой ввод на токены, используя указанный шаблон разделителя.
- Методы next() используются для чтения токенов один за другим и их обработки.
- В конце концов, закройте экземпляр Scanner, чтобы освободить системные ресурсы.
Примеры Scanner
Давайте рассмотрим некоторые общие способы использования класса Scanner с примерами кода.
1. Чтение ввода пользователя
Это самое распространенное использование класса Scanner. Мы можем создать экземпляр с использованием System.in в качестве источника ввода и считывать ввод пользователя.
// считывание ввода пользователя
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
Вывод:
Please enter your name
Pankaj
Hello Pankaj
Ну, выглядит просто и работает хорошо. Но у этого кода есть проблема. Без прочтения следующего раздела, можете ли вы проверить код и попытаться выявить проблему?
Давайте посмотрим, что происходит, когда я ввожу свое полное имя.
Please enter your name
Pankaj Kumar
Hello Pankaj
Теперь, наверняка, вы это поняли: это происходит из-за разделителя пробелов. Сканер разбивает ввод на два токена – Pankaj и Kumar. Но мы вызываем метод next() всего один раз, поэтому печатается только “Привет, Pankaj”.
Как это исправить?
Это просто. Мы можем изменить разделитель на символ новой строки, используя метод useDelimiter().
Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator"));
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
2. Разбор данных файла с помощью сканера
Давайте рассмотрим простой пример чтения и разбора CSV-файлов с использованием класса Scanner. Предположим, у меня есть файл employees.csv со следующим содержимым.
1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO
Давайте прочитаем файл и получим список сотрудников в нашей программе Java.
package com.journaldev.java;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ScannerExamples {
public static void main(String[] args) throws IOException {
// create scanner for the CSV file
Scanner sc = new Scanner(new File("employees.csv"));
// set delimiter as new line to read one line as a single token
sc.useDelimiter(System.getProperty("line.separator"));
// create the List of Employees
List<Employee> emps = new ArrayList<>();
while (sc.hasNext()) {
Employee emp = parseEmployeeData(sc.next());
emps.add(emp);
}
// close the scanner
sc.close();
// print employee records
System.out.println(emps);
}
private static Employee parseEmployeeData(String record) {
// create scanner for the String record
Scanner sc = new Scanner(record);
// set delimiter as comma
sc.useDelimiter(",");
Employee emp = new Employee();
emp.setId(sc.nextInt());
emp.setName(sc.next());
emp.setRole(sc.next());
// close the scanner
sc.close();
return emp;
}
}
class Employee {
private int id;
private String name;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString() {
return "Emp[" + id + "," + name + "," + role + "]";
}
}
- // создаем сканер для CSV-файла
- // устанавливаем разделитель как новую строку, чтобы считать одну строку как один токен
- // создаем список сотрудников
// закрываем сканер
// выводим записи сотрудников
// создаем сканер для строки записи
// устанавливаем разделитель как запятую
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);
// закрываем сканер
sc1.useDelimiter("\\D");
while(sc1.hasNext()) {
System.out.println(sc1.next());
}
Первый шаг - создать сканер для CSV-файла и установить новую строку как разделитель.
sc1.close();
Затем для каждой строки, содержащей запись сотрудника в формате CSV, разбираем ее, используя другой сканер и запятую как разделитель. parseEmployeeData() разбирает каждую строку и создает объект Employee.
1
2
345
67
8
9
10
Наконец, мы добавляем объект сотрудника в список и выводим его.
Вывод: [Emp[1,Джейн Доу,Генеральный директор], Emp[2,Мэри Энн,Главный технический директор], Emp[3,Джон Ли,Финансовый директор]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java