JavaRush /Java Blog /Random-TL /Klase ng scanner sa Java

Klase ng scanner sa Java

Nai-publish sa grupo
Kamusta! Magiging espesyal ang ating aralin ngayon! Bago ito, kapag nagresolba ng mga problema at nagsusulat ng mga programa, simple lang ang algorithm: sumusulat kami ng ilang code, patakbuhin ang main() method , ginagawa ng program ang kinakailangan dito, at lalabas. Ngunit ngayon ang lahat ay magbabago! Ngayon ay matututunan natin kung paano tunay na makipag-ugnayan sa programa: ituturo natin ito upang tumugon sa ating mga aksyon! Maaaring naiintindihan mo na kung saan tayo pupunta dito. Ilalaan namin ang panayam na ito sa isang detalyadong pagsusuri ng isa sa mga klase ng wikang Java – Scanner. Magiging kapaki-pakinabang ang klase na ito kung kailangan mong basahin ang data na ipinapasok ng mga user. Bago tayo magpatuloy sa pag-aaral ng code, sabihin sa akin, nakatagpo ka na ba ng ganoong device bilang scanner? Tiyak na oo. Ang panloob na istraktura ng scanner ay medyo kumplikado, ngunit ang kakanyahan ng trabaho nito ay medyo simple: binabasa nito ang data na ipinasok ng gumagamit dito (halimbawa, isang pasaporte o patakaran sa seguro) at iniimbak ang nabasa na impormasyon sa memorya (halimbawa. , sa anyo ng isang imahe). Kaya, ngayon gagawa ka ng sarili mong scanner! Siyempre, hindi niya kayang hawakan ang mga dokumento, ngunit napakahusay niyang mahawakan ang impormasyon sa text :) Tara na!Klase ng scanner - 1

Klase ng Java Scanner

Ang una at pinakamahalagang bagay na kailangan nating kilalanin ay ang klase java.util.Scanner. Ang pag-andar nito ay napaka-simple. Tulad ng isang tunay na scanner, nagbabasa ito ng data mula sa pinagmulan na iyong tinukoy para dito. Halimbawa, mula sa isang linya, mula sa isang file, mula sa console. Pagkatapos ay kinikilala nito ang impormasyong ito at pinoproseso ito kung kinakailangan. Ibigay natin ang pinakasimpleng halimbawa:
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);
   }
}
Gumawa kami ng scanner object at tinukoy ang data source para dito (isang string na may text). Ina-access ng pamamaraan nextLine()ang data source (ang aming teksto na may quatrains), hahanapin doon ang susunod na linya na hindi pa nito nababasa (sa aming kaso, ang una) at ibinabalik ito. Pagkatapos nito, ilalabas namin ito sa console: Output ng console:

Люблю тебя, Peterа творенье,
Maaari naming gamitin ang pamamaraan nextLine()nang maraming beses at ilabas ang buong piraso ng tula:
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);
   }
}
Sa bawat oras na ang aming scanner ay gagawa ng isang hakbang pasulong at basahin ang susunod na linya. Ang resulta ng programa ay output sa console:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Tulad ng nasabi na natin, ang data source para sa scanner ay maaaring hindi lamang isang string, kundi pati na rin, halimbawa, isang console. Mahalagang balita para sa amin: kung dati ay naglalabas lamang kami ng data doon, ngayon ay maglalagay kami ng data mula sa keyboard! Tingnan natin kung ano pa ang magagawa ng klase ng Scanner :
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()Binabasa at ibinabalik ng pamamaraan ang inilagay na numero. Sa aming programa, ito ay ginagamit upang magtalaga ng isang halaga sa isang variable number. Ito ay mas mukhang isang tunay na scanner! Hinihiling ng programa sa gumagamit na magpasok ng anumang numero sa isang linya. Matapos magawa ito ng gumagamit, pinasasalamatan siya ng programa, ipinapakita ang resulta ng trabaho nito sa console at nagtatapos. Ngunit mayroon pa rin kaming isang malubhang problema. Maaaring magkamali ang user at maglagay ng mali. Narito ang isang halimbawa kung kailan hihinto sa paggana ang aming kasalukuyang programa:
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);

   }
}
Subukan nating ilagay ang string na "JavaRush" sa halip na isang numero: Console output:
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
Oops, lahat ay masama -_- Para maiwasan ang mga ganitong sitwasyon, kailangan nating gumawa ng paraan para ma-validate ang data na ipinasok ng user. Halimbawa, ang gumagamit ay nagpasok ng anumang bagay maliban sa isang numero, mainam na magpakita ng babala sa console na ang impormasyong ipinasok ay hindi isang numero, at kung ang lahat ay nasa ayos, ipakita ang teksto ng kumpirmasyon. Ngunit para magawa ito, kailangan talaga nating "tumingin sa hinaharap" - alamin kung ano ang susunod sa ating daloy. Magagawa ba ito ng Scanner sa Java? Paano siya! At para dito mayroon itong isang buong pangkat ng mga pamamaraan: hasNextInt()- sinusuri ng pamamaraan kung ang susunod na bahagi ng ipinasok na data ay isang numero o hindi (nagbabalik ng totoo o mali, ayon sa pagkakabanggit). hasNextLine()— sinusuri kung ang susunod na piraso ng data ay isang string. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- lahat ng mga pamamaraang ito ay ginagawa ang parehong para sa iba pang mga uri ng data. Subukan nating baguhin ang ating programa para magbasa ng mga numero:
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!");
       }

   }
}
Ngayon ay sinusuri ng aming programa kung ang susunod na character na ipinasok ay isang numero o hindi. At kung ito ay, ito ay nagpapakita ng isang kumpirmasyon. Kung hindi pumasa sa pagsubok ang input, mapapansin ito ng program at hihilingin kang subukang muli. Sa pangkalahatan, maaari kang makipag-ugnayan sa bagay ng Scanner at alamin nang maaga kung anong uri ng data ang aasahan. “Hoy, scanner, ano ang susunod? Numero, string, o iba pa? Numero? At alin ang - int, short, long?” Ang flexibility na ito ay nagbibigay sa iyo ng pagkakataong buuin ang logic ng iyong program depende sa gawi ng user. Ang isa pang mahalagang paraan na nagkakahalaga ng pagbibigay pansin ay useDelimiter(). Ang paraang ito ay ipinapasa ang string na gusto mong gamitin bilang delimiter. Halimbawa, bigla kaming naging interesado sa mga tula ng Hapon at nagpasyang gamitin ang scanner upang basahin ang ilang haiku ng mahusay na makata na si Matsuo Basho. Kahit na tatlong magkakaibang mga taludtod ang ibinigay sa atin sa isang malamya na linya, madali nating mapaghihiwalay ang mga ito at mai-format nang maayos:
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();
   }
}
Ginagamit namin ang useDelimeter() method ng Scanner class bilang line separator : responsable ito sa paghati sa mga papasok na data sa mga bahagi. Sa aming kaso, ang isang solong quote ( "'" ) ay ipinasa bilang isang argumento at ginagamit upang paghiwalayin ang mga string . Ang text na sumusunod sa quote na ito ay lilitaw sa isang bagong linya dahil sa while loop ginagamit namin ang println() method ng System class para basahin ang data. Bilang resulta, magkakaroon tayo ng magandang output sa console, tulad ng sa mga aklat:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Sa parehong halimbawa, may isa pang paraan na dapat mong bigyang-pansin - close(). Tulad ng anumang bagay na gumagana sa mga stream ng I/O, dapat na sarado ang scanner kapag nakumpleto nito ang trabaho nito upang hindi na nito maubos ang mga mapagkukunan ng ating computer. Huwag kalimutan ang pamamaraan 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!

   }
}
Iyon lang! Gaya ng nakikita mo, ang klase ng Scanner ay medyo madaling gamitin at lubhang kapaki-pakinabang! :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION