Продолжаем цикл статей для начинающих материалом о классе 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 очень удобно обрабатывать различные источники информации — будь-то файлы, потоки ввода или строки.
Комментариев нет:
Отправить комментарий