Продолжаем цикл статей для начинающих материалом о классе Scanner. Сделаем краткий обзор и посмотрим на примере наиболее используемые методы.
Краткий обзор класса Scanner в Java
Класс
Scanner
используется для получения (считывания) данных введенных пользователем в виде String, byte
, short
, int
, long
, float
, double
.
Сканер выполняет поиск токенов во входной строке.
Токен (или маркер) представляет собой серию цифровых или буквенно-цифровых символов, которая заканчивается разделителем. Разделителем может быть символ табуляции, возврат каретки (перевод строки или же просто ‘Enter’), конец файла или пробел.
Пример: если пользователем был введен ряд чисел с пробелами между каждым номером, то класс Scanner будет принимать все номера в качестве отдельного токена. В этом случае пробельные символы выступают в качестве разделителей.
Пример использования Scanner в Java
Класс Scanner предоставляется с множеством конструкторов, например:
Scanner scanner = new Scanner(System.in); // получаем InputStream
Scanner fileScanner = new Scanner(new FileReader("передаем сюда имя файла"));
Scanner stringScanner = new Scanner("здесь строка"); // получаем сканер со строки
...
|
Второй конструктор бросает
FileNotFoundException
.
Давайте рассмотрим академические примеры работы с каждым из них:
1). Считываем примитивные типы данных и строку:
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
‘а локаль:
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
, если в файле есть еще токен.
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
очень удобно обрабатывать различные источники информации — будь-то файлы, потоки ввода или строки.
Комментариев нет:
Отправить комментарий