здрасти Нашият урок днес ще бъде специален! В днешния урок ще говорим за Java Scanner Class. Преди това процесът на изпълнение на задачи и писане на програми беше прост: пишем няHowъв code, изпълняваме main ()метод, програмата прави това, което се изисква, и ние сме готови. Но сега всичко ще се промени! Днес ще научим How наистина да взаимодействаме с програмата: ще я научим How да реагира на нашите действия! Преди да започнем да анализираме codeа, трябвало ли ви е да се справяте с устройство като скенер? Вероятно. Вътрешността на скенера е доста сложна, но основната идея за това How работи е много проста: той чете данни, които потребителят предоставя (като паспорт or застрахователна полица) и съхранява тази информация в паметта (например като изображение ). Днес ще създадете свой собствен скенер! Разбира се, няма да може да обработва хартиени documentи, но текстът няма да е проблем за него :) Давай!

Класът Scanner на Java

Клас на скенера - 1Първо и най-важно, трябва да се запознаем с класа java.util.Scanner . Функционалността му е много проста. Като истински скенер той чете данни от източник, който посочите. Например низ, файл, конзолата. След това той разпознава информацията и я обработва по подходящ начин. Ето най-простият пример:

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Създадохме обект на скенер и посочихме неговия източник на данни (низ от текст). Методът nextLine() осъществява достъп до източника на данни (нашият текст с четиристишие), намира следващия непрочетен ред (който е първият ред в този случай) и го връща. След това го показваме на конзолата: Изход на конзолата:

It matters not how strait the gate,
Можем да използваме метода nextLine() няколко пъти и да покажем целия откъс от стихотворението:

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Всеки път нашият скенер прави една крачка напред и чете следващия ред. Показва се резултатът от програмата:

It matters not how strait the gate, 
How charged with punishments the scroll, 
I am the master of my fate, 
I am the captain of my soul
Както вече казахме, източникът на данни на скенера не трябва да бъде низ. Например, това може да е конзолата. Някои вълнуващи новини за вас: преди само показвахме данни там, но сега ще четем данни от клавиатурата! Нека да видим Howво още прави класът Scanner :

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Методът nextInt() чете и връща въведеното число. В нашата програма го използваме, за да присвоим стойност на променливата number . Вече прorча повече на истински скенер! Програмата иска от потребителя да въведе произволен номер. След като потребителят направи това, програмата благодари на потребителя, показва резултата и завършва. Но все още имаме сериозен проблем. Потребителят може да направи грешка и да въведе нещо грешно. Ето пример, при който настоящата ни програма спира да работи:

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Нека опитаме да въведем низа "CodeGym" instead of число: Изход от конзолата:

Enter a number: 
CodeGym 
Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextInt(Scanner.java:2117) 
at java.util.Scanner.nextInt(Scanner.java:2076) 
at Main.main(Main.java:10) Process finished with exit code 1
Ъъъ, ох. Имаме големи проблеми --_- За да избегнем подобни ситуации, трябва да измислим начин за проверка на данните, въведени от потребителя. Например, ако потребителят въведе нещо различно от число, би било добре да се покаже предупреждение, че въведената информация не е число. И ако информацията е наред, тогава можем да потвърдим. Но това ще изисква от нас да „погледнем в бъдещето“, за да видим Howво идва в нашия поток. Може ли Scanner да направи това? И How! И има набор от методи за извършване на това: hasNextInt() — Този метод проверява дали следващата част от входните данни е число (връща true or false, според случая). hasNextLine() — Този метод проверява дали следващата част от входа е низ. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Всички тези методи извършват подобни проверки за останалите типове данни. Нека опитаме да променим нашата програма за четене на числа:

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Сега нашата програма проверява дали следващият въведен знак е число. И показва потвърждение само ако е така. Ако въведеното не премине проверката, програмата взема бележка и моли потребителя да опита отново. По принцип можете да комуникирате с обекта Scanner и да разберете предварително Howъв тип данни ви очаква. Число, низ or нещо друго? Номер? И Howъв вид? An int , short , long ?" Тази гъвкавост ви дава възможност да изградите програмна логика, която зависи от поведението на потребителя. Трябва да отбележим друг важен метод: useDelimiter() . Вие предавате низ на този метод. Низът съдържа знаци, които искате да използвате като разделители or разделители. Да предположим например, че внезапно сме се заинтересували от японската поезия и сме решor да използваме нашия скенер, за да прочетем някои хайку, написани от великия поет Мацуо Башо. Дори ако три различни стиха ни бъдат предадени като един неудобен низ, можем лесно да ги разделим и да ги изобразим красиво:

public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Използваме "\ n /*/*/*" (знак за нов ред и три звездички) като наш разделител. В резултат на това имаме красив конзолен изход, точно като в книгите:
On a withered branch 
A crow has alighted. 
Nightfall in autumn. 

*** 

Such a moon above, 
Like a tree cut at the root: 
The fresh cut is white. 

*** 

How the river floods! 
A heron wanders on short legs, 
Knee-deep in the water.
Този пример има още един метод, който трябва да посочим: close() . Като всеки обект, работещ с I/O потоци, скенерът трябва да бъде затворен, когато приключи, така че да спре да консумира ресурсите на компютъра. Никога не забравяйте метода close() !

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);
      
       sc.close(); // Now we've done everything right!

   }
}
Това е! Както можете да видите, колко полезен е класът Scanner е доста лесен за използване! :) За да затвърдите наученото, ви предлагаме да гледате видео урок от нашия курс по Java