JavaRush /Java блогы /Random-KK /Java тіліндегі сканер класы

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

Топта жарияланған
Сәлеметсіз бе! Бүгінгі сабағымыз ерекше болмақ! Бұған дейін есептерді шешуде және бағдарламаларды жазуда алгоритм қарапайым болды: біз кейбір codeты жазамыз, main() әдісін іске қосамыз , бағдарлама одан талап етілетін нәрсені жасайды және шығады. Бірақ қазір бәрі өзгереді! Бүгін біз бағдарламамен қалай шынайы әрекеттесу керектігін үйренеміз: біз оны өз әрекеттерімізге жауап беруге үйретеміз! Сіз мұнымен қайда баратынымызды түсінуіңіз мүмкін. Біз бұл лекцияны Java тілі кластарының бірі – Сканерді егжей-тегжейлі талдауға арнаймыз. Бұл сынып пайдаланушылар енгізетін деректерді оқу қажет болса пайдалы болады. Кодты үйренуге көшпес бұрын, айтыңызшы, сіз сканер сияқты құрылғыны кездестірдіңіз бе? Әрине иә. Сканердің ішкі құрылымы өте күрделі, бірақ оның жұмысының мәні өте қарапайым: ол пайдаланушы оған енгізген деректерді оқиды (мысалы, төлқұжат немесе сақтандыру полисі) және оқылған ақпаратты жадта сақтайды (мысалы, , сурет түрінде). Сонымен, бүгін сіз өзіңіздің сканеріңізді жасайсыз! Әрине, ол құжаттарды өңдей алмайды, бірақ мәтіндік ақпаратты жақсы өңдей алады :) Кеттік!Сканер класы - 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);
   }
}
Біз сканер нысанын жасадық және ол үшін деректер көзін көрсеттік (мәтін бар жол). Әдіс nextLine()деректер көзіне қол жеткізеді (біздің төртбұрыштары бар мәтін), ол әлі оқылмаған келесі жолды табады (біздің жағдайда, бірінші) және оны қайтарады. Осыдан кейін біз оны консольге шығарамыз: Консоль шығысы:

Люблю тебя, 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
Ой, бәрі нашар -_- Мұндай жағдайларды болдырмау үшін пайдаланушы енгізетін деректерді тексеру әдісін ойлап табу керек. Мысалы, пайдаланушы саннан басқа кез келген нәрсені енгізеді, консольде енгізілген ақпараттың сан емес екендігі туралы ескертуді көрсету жақсы болар еді, ал егер бәрі тәртіпте болса, растау мәтінін көрсету. Бірақ бұл әрекетті орындау үшін бізге «болашаққа қарау» керек – біздің ағынымызда не болатынын білу керек. 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!");
       }

   }
}
Енді біздің бағдарлама келесі енгізілген таңбаның сан немесе сан еместігін тексереді. Тек солай болса, ол растауды көрсетеді. Егер кіріс сынақтан өтпесе, бағдарлама мұны байқап, әрекетті қайталауды сұрайды. Негізінде, сіз Сканер нысанымен байланысып, қандай деректер түрі күтілетінін алдын ала біле аласыз. «Ей, сканер, енді не болады? Сан, жол немесе басқа нәрсе? Нөмір? Ал қайсысы - 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();
   }
}
Сканер класының useDelimeter() әдісін сызық бөлгіш ретінде қолданамыз : ол кіріс деректерді бөліктерге бөлуге жауапты. Біздің жағдайда жалғыз тырнақша ( «'» ) аргумент ретінде беріледі және жолдарды бөлу үшін пайдаланылады . Осы тырнақшадан кейінгі мәтін жаңа жолда пайда болады, себебі while циклінде деректерді оқу үшін System класының println () әдісін қолданамыз . Нәтижесінде консольде кітаптардағыдай әдемі нәтиже аламыз:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Дәл сол мысалда сіз міндетті түрде назар аударуыңыз керек тағы бір әдіс бар - close(). Енгізу/шығару ағындарымен жұмыс істейтін кез келген нысан сияқты, сканер жұмысы аяқталғаннан кейін компьютеріміздің ресурстарын тұтынбауы үшін жабылуы керек. Әдісті ешқашан ұмытпаңыз 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