Как работать с классом Scanner в Java: примеры
С помощью класса java.util.Scanner можно анализировать простые типы данных и строки. Этот класс принимает данные из файлов, потоков, строк, последовательностей символов или байтов.
Входные данные разбиваются на токены. По умолчанию разделителем токенов служит пробел, но его можно заменить строкой (java.lang.String) или регулярным выражением (java.util.regex.Pattern).
Для создания сканера используется конструктор Scanner, которому передаются входные данные и при необходимости тип кодировки.
Давайте рассмотрим конструкторы этого класса по порядку.
Конструктор public Scanner(Readable source)
Создает сканер, с помощью которого можно получить значения из источника, реализующего интерфейс Readable. Это могут быть объекты классов:
- BufferedReader;
- CharArrayReader;
- CharBuffer;
- FileReader;
- FilterReader;
- InputStreamReader;
- LineNumberReader;
- PipedReader;
- PushbackReader;
- Reader;
- StringReader.
Вот как это делается с помощью класса FileReader:
FileReader reader = new FileReader(new File("D:\Scanner.txt"));
Scanner scanner = new Scanner(reader);
Конструктор public Scanner(InputStream source)
Этот конструктор создает сканер, с помощью которого можно получить значения из указанного входного потока. Байты из такого потока преобразуются в символы (с использованием набора символов по умолчанию для базовой платформы).
Также есть вариант конструктора, который позволяет получать значения из входного потока, преобразовывая байты в символы с использованием набора символов, указанного пользователем:
public Scanner(InputStream source, String charsetName)
Если указанный набор символов не существует, выбрасывается исключительная ситуация IllegalArgumentException. Это справедливо для всех вариантов методов с указанием аргумента charsetName.
Например, для потока стандартного ввода он объявляется просто:
Scanner scanner = new Scanner(System.in)
Конструктор public Scanner(File source) throws FileNotFoundException
Создает сканер, который позволяет получать значения из указанного объекта класса java.io.File. Если указанный файл не найден, возникает исключительная ситуация FileNotFoundException. Символы преобразовываются в байты с использованием набора символов по умолчанию для базовой платформы.
Чтобы использовать произвольный набор символов, укажите его во втором аргументе:
public Scanner(File source, String charsetName) throws FileNotFoundException
Например:
Scanner scanner = new Scanner(new File("D:\Scanner.txt"));
Конструктор public Scanner(Path source) throws IOException
Создает сканер, который позволяет получать значения из указанного объекта, реализующего интерфейс java.nio.file.Path. При ошибке ввода-вывода возникает исключительная ситуация IOException. Символы преобразовываются в байты с использованием набора символов по умолчанию для базовой платформы.
Для использования другого набора символов укажите его во втором аргументе:
public Scanner(Path source, String charsetName) throws IOException
Давайте создадим сканер с помощью пути:
String fileName = "D:\Scanner.txt"; Path path = Paths.get(fileName); Scanner scanner = new Scanner(path);
Конструктор public Scanner(String source)
Создает сканер, который позволяет получать значения из указанной строки:
Scanner scanner = new Scanner("Parse me");
Как прочитать файл с помощью класса Scanner
Чтобы прочитать файл с помощью класса Scanner, воспользуемся конструктором, принимающим объект класса java.io.File, и методами nextLine() и hasNextLine():
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class FileScanner{
public static void main(String []args){
try{
FileReader reader = new FileReader(new File("Scanner.txt"));
Scanner scanner = new Scanner(reader);
while(scanner.hasNextLine()){
String line = scanner.nextLine();
System.out.println(line);
}
} catch(FileNotFoundException ex){
System.out.println("File not found");
}
}
}
Как прочитать ввод из консоли с помощью класса Scanner
Чтобы прочитать данные из консоли, создадим входной поток System.in и используем метод nextLine():
import java.util.Scanner;
public class ConsoleScanner{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.println(line);
}
}
Методы класса Scanner
| Тип возврата | Метод | Описание |
| void | close() | Закрывает объект сканера. |
| Pattern | delimiter() | Возвращает шаблон, который объект Scanner в настоящее время использует для сопоставления разделителей. |
| String | findlnLine(Pattern pattern) | Этот метод возвращает объект String, который удовлетворяет объекту Pattern, указанному в качестве аргумента метода. |
| String | findlnLine(String pattern) | Пытается найти следующее вхождение шаблона, созданного из указанной строки, игнорируя разделители. |
| String | findWithinHorizon(Pattern pattern, int horizon) | Ищет следующее вхождение указанного шаблона. |
| String | findWithinHorizon(String pattern, int horizon) | Ищет следующее вхождение шаблона ввода, игнорируя разделитель |
| boolean | hasNext() | Возвращает true, если у этого сканера есть другой токен на входе. |
| boolean | hasNext(Pattern pattern) | Возвращает true, если следующий полный токен соответствует указанному шаблону. |
| boolean | hasNext(String pattern) | Возвращает true, если следующий токен соответствует шаблону, созданному из указанной строки. |
| boolean | hasNextBig Decimal() | Возвращает true, если следующий токен на входе этого сканера можно интерпретировать как BigDecimal с помощью метода nextBigDecimal(). |
Подробнее о сканере можно прочитать на сайте документации по Java.

Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: