CodeGym /Java Blog /Random /Klase ng Java Scanner
John Squirrels
Antas
San Francisco

Klase ng Java Scanner

Nai-publish sa grupo
Hi! Magiging espesyal ang ating aralin ngayon! Sa aralin ngayon, pag-uusapan natin ang Java Scanner Class. Noong nakaraan, ang proseso ng pagkumpleto ng mga gawain at pagsulat ng mga programa ay simple: sumusulat kami ng ilang code, patakbuhin ang main()paraan, ginagawa ng program kung ano ang kinakailangan, at tapos na kami. Ngunit ngayon ang lahat ay magbabago! Ngayon, matututunan natin kung paano talagang makipag-ugnayan sa programa: ituturo natin ito kung paano tumugon sa ating mga aksyon! Bago natin simulan ang pagsusuri sa code, naranasan mo na bang harapin ang isang device tulad ng scanner? Malamang. Ang loob ng isang scanner ay medyo kumplikado, ngunit ang pangunahing ideya kung paano ito gumagana ay napaka-simple: binabasa nito ang data na ibinibigay ng gumagamit (tulad ng isang pasaporte o patakaran sa seguro) at iniimbak ang impormasyong ito sa memorya (halimbawa, bilang isang imahe. ). Ngayon ay gagawa ka ng sarili mong scanner! Siyempre, hindi nito kakayanin ang mga papel na dokumento, ngunit ang text ay walang problema para dito :) Tara na!

Ang klase ng Scanner ng Java

Klase ng scanner - 1Una at pangunahin, dapat tayong maging pamilyar sa klase ng java.util.Scanner . Ang pag-andar nito ay napaka-simple. Tulad ng isang tunay na scanner, nagbabasa ito ng data mula sa isang pinagmulan na iyong tinukoy. Halimbawa, isang string, isang file, ang console. Susunod, kinikilala nito ang impormasyon at pinoproseso ito nang naaangkop. Narito ang pinakasimpleng halimbawa:

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);
   }
}
Gumawa kami ng scanner object, at tinukoy ang data source nito (isang string ng text). Ina-access ng nextLine() method ang data source (ang aming text na may quatrain), hinahanap ang susunod na hindi pa nababasang linya (na siyang unang linya sa kasong ito), at ibinabalik ito. Pagkatapos ay ipinapakita namin ito sa console: Console output:

It matters not how strait the gate,
Maaari naming gamitin ang nextLine() na pamamaraan nang maraming beses at ipakita ang buong sipi ng tula:

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);
   }
}
Sa bawat oras, ang aming scanner ay tumatagal ng isang hakbang pasulong at binabasa ang susunod na linya. Ang output ng programa ay ipinapakita:

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
Gaya ng nasabi na namin, ang data source ng scanner ay hindi kailangang isang string. Halimbawa, maaaring ito ang console. Ilang kapana-panabik na balita para sa iyo: dati, nagpapakita lang kami ng data doon, ngunit ngayon ay magbabasa kami ng data mula sa keyboard! Tingnan natin kung ano pa ang ginagawa ng klase ng 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);

   }
}
Ang nextInt() na paraan ay nagbabasa at nagbabalik ng inilagay na numero. Sa aming programa, ginagamit namin ito upang magtalaga ng isang halaga sa variable na numero . Ito ay higit na katulad ng isang tunay na scanner! Hinihiling ng programa sa gumagamit na magpasok ng anumang numero. Pagkatapos gawin ito ng user, pinasasalamatan ng program ang user, ipapakita ang resulta, at matatapos. Ngunit mayroon pa rin tayong mabigat na problema. Maaaring magkamali ang user at maglagay ng mali. Narito ang isang halimbawa kung saan huminto 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 a number:");

       int number = sc.nextInt();

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

   }
}
Subukan nating ilagay ang string na "CodeGym" sa halip na isang numero: Console output:

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
Uh, oh. Malaki ang problema namin -_- Para maiwasan ang mga ganitong sitwasyon, kailangan naming gumawa ng paraan para ma-verify ang data na ipinasok ng user. Halimbawa, kung ang gumagamit ay nagpasok ng anumang bagay maliban sa isang numero, makabubuting magpakita ng babala na ang inilagay na impormasyon ay hindi isang numero. At kung okay ang impormasyon, maaari naming kumpirmahin. Ngunit ito ay mangangailangan sa amin na "tumingin sa hinaharap" upang makita kung ano ang darating sa aming stream. Magagawa ba ito ng Scanner ? At kung paano! At mayroon itong iba't ibang mga pamamaraan para sa paggawa nito: hasNextInt() — Sinusuri ng pamamaraang ito kung ang susunod na tipak ng data ng input ay isang numero (nagbabalik ng totoo o mali, kung naaangkop). hasNextLine() — Sinusuri ng paraang ito kung ang susunod na tipak ng input ay isang string. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Lahat ng mga pamamaraang ito ay nagsasagawa ng mga katulad na pagsusuri para sa natitirang mga uri ng data. Subukan nating baguhin ang aming programa sa pagbabasa ng numero:

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!");
       }

   }
}
Ngayon ay sinusuri ng aming programa kung ang susunod na character na ipinasok ay isang numero. At ito ay nagpapakita ng kumpirmasyon lamang kung ito ay. Kung ang input ay hindi pumasa sa tseke, ang program ay nagtatala at humihiling sa user na subukang muli. Karaniwan, maaari kang makipag-usap sa bagay ng Scanner at alamin nang maaga kung anong uri ng data ang naghihintay sa iyo. Isang numero, string, o iba pa? Isang numero? At anong uri? Isang int , short , long ?" Ang kakayahang umangkop na ito ay nagbibigay sa iyo ng pagkakataong bumuo ng logic ng program na nakasalalay sa pag-uugali ng user. Dapat nating tandaan ang isa pang mahalagang paraan: useDelimiter() . Ipapasa mo ang isang string sa paraang ito. Ang string ay naglalaman ng mga character na gusto mong gamitin bilang mga separator o delimiter. Halimbawa, ipagpalagay na bigla kaming naging interesado sa Japanese poetry, at nagpasya na gamitin ang aming scanner upang basahin ang ilang haiku na isinulat ng mahusay na makata na si Matsuo Bashō. Kahit na ang tatlong magkakaibang mga taludtod ay ipinasa sa atin bilang isang mahirap na string, madali nating hatiin ang mga ito at mai-render nang maganda:

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();
   }
}
Ginagamit namin ang "\ n /*/*/*" (bagong line character at tatlong asterisk) bilang aming delimiter. Bilang resulta, mayroon kaming magandang console output, tulad ng sa mga aklat:
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.
Ang halimbawang ito ay may isa pang pamamaraan na dapat nating ganap na ituro: close() . Tulad ng anumang bagay na gumagana sa mga stream ng I/O, dapat na sarado ang scanner kapag tapos na ito upang ihinto nito ang pagkonsumo ng mga mapagkukunan ng computer. Huwag kailanman kalimutan ang close() na pamamaraan!

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!

   }
}
Ayan yun! Gaya ng nakikita mo, para sa kung gaano ito kapaki-pakinabang, ang klase ng Scanner ay medyo madaling gamitin! :) Upang palakasin ang iyong natutunan, iminumungkahi naming manood ka ng isang video lesson mula sa aming Java Course
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION