JavaRush /Java Blogu /Random-AZ /Java-da skaner sinfi

Java-da skaner sinfi

Qrupda dərc edilmişdir
Salam! Bugünkü dərsimiz xüsusi olacaq! Bundan əvvəl, problemləri həll edərkən və proqram yazarkən alqoritm sadə idi: biz bir neçə kod yazırıq, main() metodunu işlədirik , proqram ondan tələb olunanı edir və çıxır. Amma indi hər şey dəyişəcək! Bu gün biz proqramla həqiqətən qarşılıqlı əlaqə qurmağı öyrənəcəyik: ona hərəkətlərimizə cavab verməyi öyrədəcəyik! Bununla hara getdiyimizi artıq başa düşə bilərsiniz. Bu mühazirəni Java dil siniflərindən birinin – Skanerin ətraflı təhlilinə həsr edəcəyik. İstifadəçilərin daxil etdiyi məlumatları oxumaq lazımdırsa, bu sinif faydalı olacaq. Kodu öyrənməyə başlamazdan əvvəl mənə deyin ki, siz heç skaner kimi cihazla rastlaşmısınızmı? Şübhəsiz ki, bəli. Skanerin daxili strukturu olduqca mürəkkəbdir, lakin onun işinin mahiyyəti olduqca sadədir: o, istifadəçinin ona daxil etdiyi məlumatları (məsələn, pasport və ya sığorta polisi) oxuyur və oxunan məlumatı yaddaşda saxlayır (məsələn, , şəkil şəklində). Beləliklə, bu gün öz skanerinizi yaradacaqsınız! Təbii ki, o, sənədləri idarə edə bilmir, amma mətn məlumatlarını kifayət qədər yaxşı idarə edə bilir :) Gedək!Skaner sinfi - 1

Java Skaner Sinfi

Tanış olmağımız lazım olan ilk və ən vacib şey sinifdir java.util.Scanner. Onun funksionallığı çox sadədir. Həqiqi bir skaner kimi, onun üçün göstərdiyiniz mənbədən məlumatları oxuyur. Məsələn, sətirdən, fayldan, konsoldan. Sonra bu məlumatı tanıyır və lazım olduqda emal edir. Ən sadə misal verək:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Biz skaner obyekti yaratdıq və onun üçün məlumat mənbəyini təyin etdik (mətnlə sətir). Metod nextLine()məlumat mənbəyinə daxil olur (dörtlüklərlə mətnimiz), orada hələ oxumadığı növbəti sətri tapır (bizim vəziyyətimizdə birinci) və onu qaytarır. Bundan sonra onu konsola çıxarırıq: Konsol çıxışı:

Люблю тебя, Peterа творенье,
Metoddan nextLine()bir neçə dəfə istifadə edib şeirin bütün hissəsini çıxara bilərik:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       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);
   }
}
Hər dəfə skanerimiz bir addım irəli atacaq və növbəti sətri oxuyacaq. Proqramın nəticəsi konsola çıxarılır:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Artıq dediyimiz kimi, skaner üçün məlumat mənbəyi təkcə sətir deyil, həm də, məsələn, konsol ola bilər. Bizim üçün vacib xəbər: əvvəllər biz orada yalnız məlumatları çıxarırdıqsa, indi klaviaturadan məlumatları daxil edəcəyik! Skaner sinfinin başqa nə edə biləcəyinə baxaq :
public class Main {

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Metod nextInt()daxil edilmiş nömrəni oxuyur və qaytarır. Proqramımızda dəyişənə qiymət təyin etmək üçün istifadə olunur number. Bu daha çox real skaner kimi görünür! Proqram istifadəçidən istənilən nömrəni sətirə daxil etməyi xahiş edir. İstifadəçi bunu etdikdən sonra proqram ona təşəkkür edir, işinin nəticəsini konsolda göstərir və bitir. Ancaq hələ də bir ciddi problemimiz var. İstifadəçi səhv edə və səhv bir şey daxil edə bilər. Mövcud proqramımızın nə vaxt işləməyi dayandıracağına dair bir nümunə:
public class Main {

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Nömrə əvəzinə “JavaRush” sətirini daxil etməyə çalışaq: Konsol çıxışı:
Enter the number:
JavaRush
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
Vay, hər şey pisdir -_- Belə halların qarşısını almaq üçün istifadəçinin daxil etdiyi məlumatları yoxlamaq üçün bir üsul tapmalıyıq. Məsələn, istifadəçi nömrədən başqa hər hansı bir şeyi daxil edir, konsolda daxil edilmiş məlumatın nömrə olmadığı barədə xəbərdarlıq göstərmək və hər şey qaydasındadırsa, təsdiqləmə mətnini göstərmək yaxşı olardı. Ancaq bunu etmək üçün, həqiqətən, "gələcəyə baxmalıyıq" - axınımızda növbəti nə olduğunu öyrənməliyik. Java-da Skaner bunu edə bilərmi? Necə edə bilər! Bunun üçün onun bütün metodlar qrupu var: hasNextInt()- metod daxil edilmiş məlumatların növbəti hissəsinin ədəd olub-olmamasını yoxlayır (müvafiq olaraq doğru və ya yalanı qaytarır). hasNextLine()— növbəti məlumat parçasının sətir olub-olmadığını yoxlayır. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- bütün bu üsullar digər məlumat növləri üçün eyni şeyi edir. Nömrələri oxumaq üçün proqramımızı dəyişdirməyə çalışaq:
public class Main {

   public static void main(String[] args) {

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

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

   }
}
İndi proqramımız daxil edilən növbəti simvolun nömrə olub-olmadığını yoxlayır. Və yalnız belədirsə, təsdiqləməni göstərir. Giriş testdən keçmirsə, proqram bunu görür və yenidən cəhd etməyinizi xahiş edir. Əsasən, siz Skaner obyekti ilə əlaqə saxlaya və hansı növ məlumatların gözlənəcəyini əvvəlcədən bilə bilərsiniz. “Hey, skaner, bundan sonra nə var? Nömrə, sim və ya başqa bir şey? Nömrə? Hansı biri - int, short, long?” Bu çeviklik sizə istifadəçi davranışından asılı olaraq proqramınızın məntiqini qurmaq imkanı verir. Diqqət yetirməyə dəyər başqa bir vacib üsuldur useDelimiter(). Bu üsul ayırıcı kimi istifadə etmək istədiyiniz sətirdən ötürülür. Məsələn, biz birdən yapon poeziyasına maraq göstərdik və böyük şair Matsuo Başonun bir neçə haykunu oxumaq üçün skanerdən istifadə etmək qərarına gəldik. Bizə bir yöndəmsiz sətirdə üç fərqli ayə verilsə belə, biz onları asanlıqla ayırıb gözəl formatlaşdıra bilərik:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

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

       scan.close();
   }
}
Biz Scanner sinifinin useDelimeter() metodundan xətt ayırıcı kimi istifadə edirik : o, daxil olan məlumatların hissələrə bölünməsinə cavabdehdir. Bizim vəziyyətimizdə tək sitat ( "'" ) arqument kimi ötürülür və sətirləri ayırmaq üçün istifadə olunur . Bu sitatdan sonrakı mətn yeni sətirdə görünür, çünki while dövrəsində məlumatları oxumaq üçün System sinifinin println() metodundan istifadə edirik . Nəticədə, konsolda kitablarda olduğu kimi gözəl bir çıxışımız olacaq:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Eyni nümunədə, mütləq diqqət etməli olduğunuz daha bir üsul var - close(). I/O axınları ilə işləyən hər hansı obyekt kimi, skaner öz işini başa vurduqdan sonra bağlanmalıdır ki, kompüterimizin resurslarını daha sərf etməsin. Metodunu heç vaxt unutma close()!
public class Main {

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
Hamısı budur! Gördüyünüz kimi, Scanner sinfindən istifadə etmək olduqca asandır və çox faydalıdır! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION