JavaRush /Java блогу /Random-KY /Java тилиндеги сканер классы

Java тилиндеги сканер классы

Группада жарыяланган
Салам! Бүгүнкү сабагыбыз өзгөчө болот! Буга чейин көйгөйлөрдү чечүүдө жана программаларды жазууда алгоритм жөнөкөй эле: биз кандайдыр бир codeду жазабыз, main() ыкмасын иштетебиз , программа андан талап кылынган нерсени аткарат жана чыгат. Бирок азыр баары өзгөрөт! Бүгүн биз программа менен чындап өз ара аракеттенүүнү үйрөнөбүз: биз аны өз аракеттерибизге жооп берүүгө үйрөтөбүз! Сиз муну менен кайда бара жатканыбызды түшүнгөн болушуңуз мүмкүн. Биз бул лекцияны Java тorнин класстарынын бири – Сканердин деталдуу талдоосуна арнайбыз. Эгер колдонуучулар киргизген маалыматтарды окуу керек болсо, бул класс пайдалуу болот. Кодду үйрөнүүгө өтүүдөн мурун айтыңызчы, сиз сканер сыяктуу аппаратты кезиктирдиңиз беле? Албетте ооба. Сканердин ички түзүлүшү кыйла татаал, бирок анын ишинин маңызы абдан жөнөкөй: ал колдонуучу ага киргизген маалыматтарды (мисалы, паспорт же камсыздандыруу полиси) окуйт жана окуган маалыматты эс тутумда сактайт (мисалы , сүрөт түрүндө). Ошентип, бүгүн сиз өзүңүздүн сканериңизди түзөсүз! Албетте, ал documentтерди иштете алbyte, бирок ал тексттик маалыматты жакшы иштете алат :) Кеттик!Сканер классы - 1

Java сканер классы

Биринчи жана эң маанилүү нерсе - бул класс java.util.Scanner. Анын иштеши абдан жөнөкөй. Чыныгы сканер сыяктуу, ал сиз көрсөткөн булактан маалыматтарды окуйт. Мисалы, саптан, файлдан, консолдон. Андан кийин ал бул маалыматты тааныйт жана керек болсо иштетет. Эң жөнөкөй мисал келтирели:
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);
   }
}
Биз сканер an objectин түздүк жана ал үчүн маалымат булагын көрсөттүк (текст менен сап). Метод nextLine()маалымат булагына кирет (биздин текстибиз төрт бурчтуу), ал жерден окуй элек кийинки сапты табат (биздин учурда биринчи) жана аны кайтарат. Андан кийин биз аны консолго чыгарабыз: Console output:

Люблю тебя, Peterа творенье,
Биз ыкманы nextLine()бир нече жолу колдонуп, ырдын бүт бөлүгүн чыгара алабыз:
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);
   }
}
Ар бир жолу биздин сканер бир кадам алдыга чыгып, кийинки сапты окуйт. Программанын натыйжасы консолго чыгарылат:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Жогоруда айтылгандай, сканер үчүн маалымат булагы сап гана эмес, ошондой эле, мисалы, консол болушу мүмкүн. Биз үчүн маанилүү жаңылык: эгерде мурда биз ал жакка маалыматтарды гана чыгарсак, эми клавиатурадан маалыматтарды киргизебиз! Сканер классы дагы эмне кыла аларын карап көрөлү :
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);

   }
}
Метод nextInt()киргизилген санды окуйт жана кайтарат. Биздин программада ал өзгөрмөгө маани берүү үчүн колдонулат number. Бул чыныгы сканерге көбүрөөк окшош! Программа колдонуучудан каалаган санды сапка киргизүүнү суранат. Колдонуучу муну жасагандан кийин, программа ага ыраазычылык билдирип, консолдо өз ишинин натыйжасын көрсөтөт жана аяктайт. Бирок бизде дагы эле бир олуттуу көйгөй бар. Колдонуучу ката кетирип, туура эмес киргизиши мүмкүн. Бул жерде биздин учурдагы программа качан иштебей калышынын мисалы:
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);

   }
}
Келгиле, сандын ордуна “JavaRush” сабын киргизип көрөлү: Консолдун чыгышы:
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
Ой, баары жаман -_- Мындай жагдайларды болтурбоо үчүн колдонуучу киргизген маалыматтарды текшерүүнүн жолун табышыбыз керек. Мисалы, колдонуучу сандан башка нерсени киргизсе, консолдо киргизилген маалымат сан эмес экендиги тууралуу эскертүүнү көрсөтсө жакшы болмок, эгер баары өз ордунда болсо, ырастоо текстин көрсөтүү. Бирок бул үчүн, биз чындыгында “келечекке көз чаптырышыбыз керек” – биздин агымыбызда эмне болорун бorшибиз керек. Javaдагы сканер муну жасай алабы? Кантип ал! Жана бул үчүн ал методдордун бүтүндөй тобуна ээ: hasNextInt()- метод киргизилген маалыматтардын кийинки бөлүгү сан же жокпу текшерет (тиешелүү түрдө чын же жалганды кайтарат). 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 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!");
       }

   }
}
Эми биздин программа кийинки киргизилген символдун санбы же жокпу текшерет. Жана ошондой болсо гана, ал ырастоону көрсөтөт. Киргизүү сыноодон өтпөй калса, программа муну байкап, кайра аракет кылууну суранат. Негизи, сиз Сканер an objectи менен байланышып, кандай типтеги маалыматтарды алдын ала биле аласыз. «Эй, сканер, эми эмне болот? Сан, сап же башка нерсе? Номер? Анан кайсынысы - int, short, long?” Бул ийкемдүүлүк колдонуучунун жүрүм-турумуна жараша программаңыздын логикасын түзүүгө мүмкүнчүлүк берет. Көңүл бурууга арзырлык дагы бир маанилүү ыкма useDelimiter(). Бул ыкма сиз бөлгүч катары колдонгуңуз келген саптан өтөт. Мисалы, биз капыстан жапон поэзиясына кызыгып, сканердин жардамы менен улуу акын Мацуо Башонун бир нече хайкусун окууну чечтик. Бизге бир олдоксон сапта үч түрдүү аят берилсе да, аларды оңой эле ажыратып, сонун форматтай алабыз:
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();
   }
}
Биз Scanner классынын useDelimeter() ыкмасын сызык бөлгүч катары колдонобуз : ал келген маалыматтарды бөлүктөргө бөлүүгө жооптуу. Биздин учурда, бир тырмакча ( "'" ) аргумент катары берилет жана саптарды бөлүү үчүн колдонулат . Бул цитатадан кийинки текст жаңы сапта пайда болот, анткени while циклинде биз маалыматтарды окуу үчүн System классынын println() ыкмасын колдонуп жатабыз . Натыйжада, биз консолдо китептердегидей сонун жыйынтыкка ээ болобуз:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Ошол эле мисалда дагы бир ыкма бар, ага сөзсүз көңүл буруш керек - close(). Киргизүү/чыгаруу агымдары менен иштеген ар кандай an object сыяктуу эле, сканер жумушу аяктагандан кийин жабылышы керек, ал мындан ары биздин компьютердин ресурстарын керектебеши үчүн. Эч качан ыкманы унутпаңыз 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!

   }
}
Баары болду! Көрүнүп тургандай, Сканер классын колдонуу оңой жана абдан пайдалуу! :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION