MyTetra Share
Делитесь знаниями!
Класс Scanner / чтение из файла
Время создания: 05.09.2017 23:23
Текстовые метки: code
Раздел: Java - Tutorial - Streams
Запись: xintrea/mytetra_db_mcold/master/base/1504643029m2ppd9p3ar/text.html на raw.githubusercontent.com

Класс Scanner в Java — описание и пример использования

 26/01/2017  javadevbloger  Java,Начало работы

Продолжаем цикл статей для начинающих материалом о классе Scanner. Сделаем краткий обзор и посмотрим на примере наиболее используемые методы.

Краткий обзор класса Scanner в Java

Класс Scanner используется для получения (считывания) данных введенных пользователем в виде Stringbyteshortintlongfloatdouble.

Сканер выполняет поиск токенов во входной строке.

Токен (или маркер) представляет собой серию цифровых или буквенно-цифровых символов, которая заканчивается разделителем. Разделителем может быть символ табуляции, возврат каретки (перевод строки или же просто ‘Enter’), конец файла или пробел.

Пример: если пользователем был введен ряд чисел с пробелами между каждым номером, то класс Scanner будет принимать все номера в качестве отдельного токена. В этом случае пробельные символы выступают в качестве разделителей.

Пример использования Scanner в Java

Класс Scanner предоставляется с множеством конструкторов, например:


Java


1

2

3

4

Scanner scanner = new Scanner(System.in); // получаем InputStream

Scanner fileScanner = new Scanner(new FileReader("передаем сюда имя файла"));

Scanner stringScanner = new Scanner("здесь строка"); // получаем сканер со строки

...

Второй конструктор бросает FileNotFoundException.

Давайте рассмотрим академические примеры работы с каждым из них:

1). Считываем примитивные типы данных и строку:


Java


1

2

3

4

5

6

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‘а локаль:


Java


1

2

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, если в файле есть еще токен.


Java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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 очень удобно обрабатывать различные источники информации — будь-то файлы, потоки ввода или строки.


Работа со сканером в Java (ввод и вывод данных)

 


Данная статья:

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java"

Предлагаем вспомнить 2 примера из жизни, которые как нельзя кстати будут для изучения данной темы.

  1. Когда мы путешествуем, в аэропорту наш багаж пропускают через ленту со сканером. Вот она была наша сумка на входе. Просканировал сканер сумку и работник аэропорта четко знает что ж мы там такое везём в ней.
  2. Точно также работает сканнер в магазинах. Вот был штрих-код на входе, отсканировал штрих-код продавец и теперь всё-всё знает о продукте, который числится под этим штрих-кодом.

Чем то схожие задачи есть и в мире программирования на Java. Например, часто необходимо выполнить такие задачи:

  • Пользователь ввёл в консоли какое-то число. А программа должна считать с консоли, какое же число ввёл пользователь.
  • Пользователь ввёл в консоли какое-то слово. А программа должна считать с консоли, какое же слово ввёл пользователь.

Для решения таких задач в Java используется сканер (от англ. Scanner).  Запомните: если что-то ввели в консоли, а нам надо считать что же именно ввели  - используем сканер.

Итак, рассмотрим несколько примеров кода, после которых Вы:

  1. Поймёте на практике как работает сканер. Всего в статье будет 6 примеров кода.Рекомендуем все примеры кода запускать на своём компьютере и на практике изучать как это работает.
  2. Освоите 4 метода сканера:

next ();

nextLine ();

nextInt ();

nextDouble ();

Методы - это, грубо говоря, действия, которые может выполнять Scanner. На самом деле методов у сканера намного больше. Но на данном этапе Вам будет достаточно этих 4 методов. Ну что, поехали!!!


Пример №1 - с методом nextInt ()

Допустим, мы хотим, чтоб пользователь ввёл в консоль любое целое число от 1 до 10, а программа вывела ему ответ, какое именно число он ввёл.

Поскольку нам необходимо как бы "сосканировать", какое число ввёл пользователь, всё логично - нам понадобится сканер. Ниже приводим решение и комментарии к решению.

Решение:


1

2

3

4

5

6

7

8

9

10

import java.util.Scanner; // импорт сканера

 

class Test {

public static void main(String args[]){

System.out.print("Введите любое целое число от 1 до 10: ");

Scanner scan = new Scanner(System.in);

int number = scan.nextInt();

System.out.println ("Вы ввели число " + number);

}

}

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее: 

Введите любое целое число от 1 до 10:

Затем, если Вы, например, введёте число 5, то в консоли будет следующее:

Введите любое целое число от 1 до 10: 5
Вы ввели число 5

Комментарии:

В статье "Что такое библиотека Java?" мы с Вами разобрались,  что в Java есть огромная библиотека протестированного кода - это уже готовые решения ко многим задачам, которые стоят перед программистами в их ежедневной работе. Также мы говорили о различных пакетах, классах и методах. Так вот, сейчас мы будем с Вами работать с пакетом java.util. В этом пакете есть класс Scanner. И у него есть методы (действия), которые позволяют работать с вводом и выводом информации в консоль.


Но чтобы мы смогли использовать в нашем коде класс Scanner, нам необходимо сделать 3 шага.

Шаг №1 - обязательно прописать вот такую строчку в коде


1

import java.util.Scanner; // импорт сканнера

Зачем мы прописали эту строчку? С помощью этой строчки мы импортировали из пакета java.util класс ScannerЕсли бы мы забыли это написать, сканер бы просто не работал. Также обратите внимание где мы прописали эту строчку.

Далее мы попросили пользователя ввести любое целое число от 1 до 10. Для этого написали


1

System.out.print("Введите любое целое число от 1 до 10: ");

ШАГ №2 - объявить сканер


1

Scanner scan = new Scanner(System.in);


  1. С помощью Scanner scan мы указали, что переменная будет иметь имя scan и будет относится к классу Scanner. Обязательно перед именем переменной прописать слово Scanner. А саму переменную можете называть, как хотите. Не обязательно scan.
  2. Затем пишем = new Scanner (System.in);

Когда Вы дойдете до темы классов, Вы намного лучше поймёте эту конструкцию. На данном этапе достаточно этого для понимания.

ШАГ №3 - считать число с консоли


1

int number = scan.nextInt();

  1. С помощью int number мы объявили переменную с именем number, относящуюся к типу int. Почему именно тип int мы выбрали для переменной? Потому что по условию задачи пользователь должен ввести любое целое число от 1 до 10. Соответственно, мы ожидаем что введенное пользователем число будет целым. И поэтому для переменной number выбрали целочисленный тип int.
  2.  = scan. nextInt ();  метод сканера nextInt() отвечает за то, чтобы считать введенное пользователем  целое число с консоли. То есть с помощью scan.nextInt () мы считываем введенное целое число с консоли и присваиваем его переменной  number.

Всё, теперь в переменной number у нас будет то число, которое введёт пользователь. Ура!

Затем нам нужно было вывести введённое пользователем число в консоль, и мы это сделали с помощью вот этой строчки


1

System.out.println ("Вы ввели число " + number);



Пример №2 - с методом nextInt ()

Попросите пользователя ввести 2 любых целых числа. После этого необходимо вывести в консоль сумму этих 2 чисел

Решение:


1

2

3

4

5

6

7

8

9

10

11

12

import java.util.Scanner; // импорт сканера

 

public class Test {

public static void main(String[] args) {

 

Scanner k = new Scanner(System.in);

System.out.println ("Введите 2 любых целых числа: ");

int number1 = k.nextInt();//считывает первое число и присваивает значение в number1

int number2 = k.nextInt();//считывает второе число и присваивает значение в number2

System.out.print(number1 + number2);//выводит сумму number1 + number2

}

}

Если Вы попробуете запустить этот код на своем компьютере, то в консоли Вы увидите следующее: 

Введите 2 любых целых числа:

Затем, если Вы, например, введёте число 1 и число 2, то в консоли будет следующее:

Введите 2 любых целых числа:
1
2
3

Комментарии:

Опять сделали 3 шага для подключения сканнера.

ШАГ №1: Импортировали сканнер из пакета java.util


1

import java.util.Scanner; // импорт сканера

Затем попросили пользователя ввести любых 2 целых числа


1

System.out.println ("Введите 2 любых целых числа: ");

ШАГ №2 - объявляем сканер


1

Scanner k = new Scanner(System.in);

  1. С помощью Scanner k мы указали, что переменная будет иметь имя k и будет относится к классу Scanner. Обязательно перед именем переменной прописать слово Scanner. А саму переменную можете называть как хотите. Не обязательно k.
  2. Затем пишем = new Scanner (System.in);

ШАГ №3 - считали число с консоли

Причем сделали это 2 раза, потому что мы же попросили пользователя ввести 2 числа.


1

int number1 = k.nextInt();


1

int number2 = k.nextInt();

Всё, теперь в переменной number1 и переменной number2 у нас будут те числа, которые введет пользователь.

И затем вывели на экран сумму number1 и number2


1

System.out.print(number1 + number2);//выводит сумму number1 + number2



Пример №3 - с методом nextLine ()

Допустим мы хотим, чтобы пользователь вводил в консоль любое слово или фразу, а мы могли бы вывести ему какое слово или фразу он ввёл.

Решение:


1

2

3

4

5

6

7

8

9

10

11

import java.util.Scanner; // импорт сканнера

 

public class Test {

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

System.out.println("Введите любое слово или фразу: ");

String phrase1 = sc.nextLine();

System.out.println(phrase1);

}

}

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее: 

Введите любое слово или фразу:

Затем, если, например, пользователь введёт фразу "Я повелитель Сканера", то в консоли будет следующее:

Введите любое слово или фразу:
я повелитель Сканера
я повелитель Сканера

Комментарии:

Опять сделали 3 шага для подключения сканера.

ШАГ №1: Импортировали сканер из пакета java.util


1

import java.util.Scanner; // импорт сканера

Затем попросили пользователя ввести любое слово или фразу


1

System.out.println("Введите любое слово или фразу: ");

ШАГ №2 - объявили сканер


1

Scanner sc = new Scanner(System.in);

ШАГ №3 - считали слово или фразу с консоли


1

String phrase1 = sc.nextLine();

  1. С помощью String phrase1 мы объявили переменную с именем phrase1, относящуюся к типу String. Почему именно тип String мы выбрали для переменной? Потому что по условию задачи пользователь должен ввести слово или фразу. Соответственно, мы ожидаем, что пользователь введёт слово или фразу. И поэтому для переменной phrase1 мы выбрали тип String.
  2.  = sc. nextLine (); отвечает за то считывание введенного пользователем слова или фразы с консоли. То есть с помощью метода nextLine () мы считываем введенное слово или фразу с консоли и присваиваем его переменной phrase1.

Теперь в переменной phrase1 у нас будет то слово или фраза, которые введёт пользователь.

Обратите внимание:  для целых чисел, как в примере №1 и №2, мы использовали метод nextInt (); Поскольку здесь мы уже ожидаем не целое число, а то что пользователь введет (слово или фразу), используется метод nextLine();

И далее выводим в консоль слово или фразу, которые ввел пользователь


1

System.out.println(phrase1);



Пример №4 - с методом nextLine ()

Допустим мы хотим, чтобы пользователь вводил в консоль сразу несколько слов или фраз, а мы могли бы вывести ему одной строчкой, что же он ввёл.

Решение:


1

2

3

4

5

6

7

8

9

10

11

12

import java.util.Scanner; // импорт сканера

 

public class Test {

    public static void main(String[] args) {

 

        Scanner sc = new Scanner(System.in);

        System.out.println("Введите любые 2 слова или фразу: ");

        String phrase1 = sc.nextLine();

        String phrase2 = sc.nextLine();

        System.out.println(phrase1 + " " + phrase2);

    }

}

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее: 

Введите любые 2 слова или  фразу:

Затем, если, например, пользователь введёт фразу "Я обожаю" и затем слово "Java" то в консоли будет следующее:

Я обожаю
Java
Я обожаю Java

Комментарии:

Опять сделали 3 шага для подключения сканера.

ШАГ №1: Импортировали сканер из пакета java.util


1

import java.util.Scanner;

Затем попросили пользователя ввести любые 2 слова или фразу


1

System.out.println("Введите любых 2 слова или фразу: ");

ШАГ №2 - объявили сканер


1

Scanner sc = new Scanner(System.in);

ШАГ №3 - считали слово или фразу с консоли


1

2

String phrase1 = sc.nextLine();

String phrase2 = sc.nextLine();

  1. С помощью String phrase1  и String phrase2  мы объявили переменные с именем phrase1 и phrase2, относящиеся к типу String. Почему именно тип String мы выбрали для переменных? Потому что по условию задачи, пользователь должен ввести 2 любые слова или фразу. Соответственно, мы ожидаем что пользователь введёт 2 слова или фразу. И поэтому для переменных phrase1 и phrase2 мы выбрали тип String.
  2.  = sc. nextLine (); отвечает за то, чтобы считать введенное пользователем слово или фразу с консоли. То есть с помощью метода nextLine () мы считываем введенное слово или фразу с консоли и присваиваем его в переменную phrase1 и phrase2.

И далее вывели в консоль 2 слова или 2 фразы, которые ввёл пользователь


1

System.out.println(phrase1 + " " + phrase2);

Обратите внимание: между phrase1 и phrase2 мы добавили " ". Если бы мы это не сделали, в консоль было бы выведено следующее:

Я обожаю
Java
Я обожаюJava


Пример №5 - с методом next ()

Допустим, Вы хотите, чтоб пользователь ввёл любое слово или фразу. И при этом, чтобы программа вывела в консоль всё до первого пробела.

Например, если пользователь введёт "Работа со сканнером - это круто", программа прочитает только слово "Работа". Потому что первый пробел появляется после слова "работа".

Или если пользователь, например, введёт "Я люблю Java", программа прочитает только слово "Я". Потому что первый пробел появляется после слова "Я".

В общем, логику Вы поняли. Смотрим как это будет в коде.

Решение:


1

2

3

4

5

6

7

8

9

10

11

import java.util.Scanner; // импорт сканера

 

public class Test {

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

System.out.println("Введите любое слово или фразу: ");

String phrase1 = sc.next();

System.out.println(phrase1);

}

}

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее: 

Введите любое слово или фразу:

Затем, если, например, пользователь введёт фразу "Я повелитель Сканера", в в консоли будет следующее:

Введите любое слово или фразу:
я повелитель Сканера
я

Комментарии:

Опять сделали 3 шага для подключения сканера.

ШАГ №1: Импортировали сканер из пакета java.util


1

import java.util.Scanner;

ШАГ №2 - объявили сканер


1

Scanner sc = new Scanner(System.in);

Затем попросили пользователя ввести любое слово или фразу


1

System.out.println("Введите любое слово или фразу: ");

ШАГ №3 - считали слово или фразу с консоли


1

String phrase1 = sc.next();

  1. С помощью String phrase1 мы объявили переменную с именем phrase1, относящуюся к типу String. Почему именно тип String мы выбрали для переменной? Потому что по условию задачи, пользователь должен ввести слово или фразу. Соответственно, мы ожидаем что пользователь введёт слово или фразу. И поэтому для переменной phrase1 мы выбрали тип String.
  2.  = sc. next ();  считывает введенное пользователем слово или фразу с консоли до первого пробела. То есть с помощью метода next () мы считываем введенное слово или фразу с консоли до первого пробела и присваиваем его в переменную phrase1.

Теперь в переменной phrase1 у нас будет всё, что будет до первого пробела.

И далее выводим в консоль то, что будет до первого пробела.


1

System.out.println(phrase1);



Пример №6 - с методом nextDouble ()

Допустим Вы хотите, чтоб пользователь ввёл любое дробное число. А программа должна считать, какое же число ввёл пользователь, и вывести в консоль.

Решение:


1

2

3

4

5

6

7

8

9

10

import java.util.Scanner; // импорт сканера

 

class Test {

public static void main(String args[]){

System.out.print("Введите любое дробное число: ");

Scanner scan = new Scanner(System.in);

double number = scan.nextDouble();

System.out.println ("Вы ввели число " + number);

}

}

Если Вы попробуете запустить этот код на своём компьютере, то в консоли Вы увидите следующее: 

Введите любое дробное число:

Затем, если Вы, например, введёте число 2,0  - в консоли будет следующее:

Введите любое дробное число:
2,0
Вы ввели число 2.0

Комментарии:


ВНИМАНИЕ - БАГ!!!

Обратите внимание, что все числа типа double всегда пишутся в коде в формате 2.0. То есть через точку, а не через запятую.

А когда мы вводили число типа double в консоли, мы специально ввели в формате 2,0 - через запятую. При этом программа вывела нам в правильном формате 2.0 - "Вы ввели число 2.0"

Это баг. Просто нужно запомнить, что когда Вы вводите число типа double в консоли, надо его вводить через запятую. Если бы Вы ввели число в консоль в формате 2.0, программа выдала бы Вам ошибку!

В коде мы опять сделали 3 шага для подключения сканера.

ШАГ №1: Импортировали сканер из пакета java.util


1

import java.util.Scanner;

Затем попросили пользователя ввести любое дробное число


1

System.out.print("Введите любое дробное число: ");

ШАГ №2 - объявили сканнер


1

Scanner scan = new Scanner(System.in);

ШАГ №3 - считали число с консоли


1

double number = scan.nextDouble();

  1. С помощью double number мы объявили переменную с именем number, относящуюся к типу double. Почему именно тип double мы выбрали для переменной? Потому что по условию задачи, пользователь должен ввести любое дробное число. Соответственно, мы ожидаем что введённое пользователем число будет дробным. И поэтому для переменной number выбрали тип double.
  2.  = scan. nextDouble ();  метод сканера nexDouble() отвечает за то, чтобы считать введённое пользователем дробное число с консоли. То есть с помощью scan.nextDouble () мы считываем введённое дробное число и присваиваем его переменной number.

Всё, теперь в переменной number у нас будет то число, которое введёт пользователь

Затем нам нужно было вывести введённое пользователем число в консоль, и мы это сделали с помощью


1

System.out.println ("Вы ввели число " + number);



 ПОДЫТОЖИМ

Чтобы использовать сканер, необходимо сделать 3 шага:

Шаг №1: Сделать импорт сканера из пакета java.util


1

import java.util.Scanner;

Шаг №2: Объявить сканер. Например:


1

Scanner scan = new Scanner(System.in);

Шаг №3: Вызвать соответствующий метод для считывания с консоли. Например:


1

int number = scan.nextInt();

Методы сканера, которые Вы уже знаете:

next (); - считывает введённую строку до первого пробела

nextLine (); - считывает всю введённую строку

nextInt (); - считывает введённое число int

nextDouble (); - считывает введённое число double

Также помним, что при использовании метода nextDouble () для дробных чисел, числа в консоли вводим через запятую, а не через точку. Например: 7,5

 
MyTetra Share v.0.59
Яндекс индекс цитирования