Класс Scanner в Java

java.util.Scanner — новая возможность в Java 5. Мы можем получать пользовательский ввод через класс Scanner.

Ниже приведён базовый синтаксис создания объекта Scanner:

Scanner s = new Scanner(System.in);

Далее мы демонстрируем простой ввод данных и получаем входную строку с помощью методов next() и nextLine() класса Scanner. Перед чтением нам обычно нужно использовать hasNext и hasNextLine, чтобы определить, есть ли ещё входные данные:

Использование метода next:

Код файла ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Получение данных с клавиатуры //Получение строки с помощью метода next System.out.println("Получение с помощью метода next:"); //Определить, есть ли ещё ввод if (scan.hasNext()) { String str1 = scan.next(); System.out.println("Введённые данные:" + str1); } scan.close(); } }

Вывод после выполнения вышеприведённой программы:

$ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
example com
输入的数据为:example

Видно, что строка com не была выведена. Далее рассмотрим nextLine.

Использование метода nextLine:

Код файла ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Получение данных с клавиатуры //Получение строки с помощью метода nextLine System.out.println("Получение с помощью метода nextLine:"); //Определить, есть ли ещё ввод if (scan.hasNextLine()) { String str2 = scan.nextLine(); System.out.println("Входные данные:" + str2); } scan.close(); } }

Вывод после выполнения вышеприведённой программы:

$ javac ScannerDemo.java
$ java ScannerDemo
nextLine方式接收:
example com
输入的数据为:example com

Видно, что строка com выводится.

Разница между next() и nextLine()

next():

  • 1. Ввод может быть завершён только после считывания допустимых символов.
  • 2. Метод next() автоматически удаляет пробельные символы, встречающиеся перед допустимыми входными символами.
  • 3. Только после ввода допустимых символов пробельные символы после них будут использоваться в качестве разделителя или терминатора.
  • next() не может получить строку с пробелами.

nextLine():

  • 1. Enter является терминатором, то есть метод nextLine() возвращает все символы до ввода клавиши Enter.
  • 2. Метод может получать пробельные символы.

Если вы хотите вводить данные типа int или float, класс Scanner также поддерживает это, но перед вводом лучше использовать метод hasNextXxx() для проверки, а затем nextXxx() для чтения:

Код файла ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Получение данных с клавиатуры int i = 0; float f = 0.0f; System.out.print("Введите целое число:"); if (scan.hasNextInt()) { //Проверить, является ли ввод целым числом i = scan.nextInt(); //Получить целое число System.out.println("Целочисленные данные:" + i); } else { //Сообщение об ошибке ввода System.out.println("Введено не целое число!"); } System.out.print("Введите десятичное число:"); if (scan.hasNextFloat()) { //Проверить, является ли ввод десятичным числом f = scan.nextFloat(); //Получить десятичное число System.out.println("Десятичные данные:" + f); } else { //Сообщение об ошибке ввода System.out.println("Введенное значение не является десятичным числом!"); } scan.close(); } }

Вывод после выполнения вышеприведённой программы:

$ javac ScannerDemo.java
$ java ScannerDemo
输入整数:12
整数数据:12
输入小数:1.2
小数数据:1.2

В следующем примере мы можем ввести несколько чисел и вычислить их сумму и среднее. Каждое число подтверждается нажатием Enter. Завершите ввод, введя нечисловое значение, затем выводится результат выполнения:

Код файла ScannerDemo.java:

import java.util.Scanner; class ExampleTest { public static void main(String[] args) { System.out.println("Пожалуйста, введите число:"); Scanner scan = new Scanner(System.in); double sum = 0; int m = 0; while (scan.hasNextDouble()) { double x = scan.nextDouble(); m = m + 1; sum = sum + x; } System.out.println(m + "Сумма чисел равна" + sum); System.out.println(m + "Среднее чисел равно" + (sum / m)); scan.close(); } }

Вывод после выполнения вышеуказанной программы (введите не число, чтобы завершить ввод):

$ javac ScannerDemo.java
$ java ScannerDemo
请输入数字:
12
23
15
21.4
end
4个数的和为71.4
4个数的平均值是17.85

Часто используемые методы

Метод Описание
Конструкторы
Scanner(File source) Создание Scanner из файла
Scanner(InputStream source) Создание Scanner из входного потока
Scanner(String source) Создание Scanner из строки
Основные методы ввода
boolean hasNext() Проверка наличия следующего токена (разделённого пробелами)
String next() Чтение следующего токена (строки)
boolean hasNextLine() Проверка наличия следующей строки
String nextLine() Чтение содержимого следующей строки
Методы проверки типов
boolean hasNextInt() Проверить, является ли следующий токен целым числом
boolean hasNextDouble() Проверить, является ли следующий токен числом типа double
boolean hasNextBoolean() Проверить, является ли следующий токен значением boolean
Методы чтения типов
int nextInt() Прочитать следующее целое число
double nextDouble() Прочитать следующее число типа double
boolean nextBoolean() Прочитать следующее значение boolean
long nextLong() Прочитать следующее длинное целое число
float nextFloat() Прочитать следующее число типа float
short nextShort() Прочитать следующее короткое целое число
byte nextByte() Прочитать следующее значение типа byte
Управление разделителями
Scanner useDelimiter(String pattern) Установить шаблон разделителя
Scanner useDelimiter(Pattern pattern) Установить разделитель с помощью регулярного выражения
String delimiter() Вернуть текущий используемый шаблон разделителя
Другие методы
void close() Закрыть сканер
Scanner skip(Pattern pattern) Пропустить ввод, соответствующий указанному шаблону
Scanner skip(String pattern) Пропустить ввод, соответствующий указанной строке
String findInLine(Pattern pattern) Найти указанный шаблон в текущей строке
String findInLine(String pattern) Найти указанную строку в текущей строке
Scanner reset() Сбросить сканер
Locale locale() Вернуть текущую локаль, используемую сканером
Scanner useLocale(Locale locale) Установить локаль сканера

Для получения дополнительных сведений обратитесь к документации API:https://www.example.com/manual/jdk11api/java.base/java/util/Scanner.html。

Другие расширения