CodeGym/Blog Java/Aleatoriu/Clasa de scanare Java
John Squirrels
Nivel
San Francisco

Clasa de scanare Java

Publicat în grup
Bună! Lecția noastră de astăzi va fi specială! În lecția de astăzi, vom vorbi despre Java Scanner Class. Anterior, procesul de finalizare a sarcinilor și de scriere a programelor era simplu: scriem ceva cod, rulăm main ()metoda, programul face ceea ce este necesar și am terminat. Dar acum totul se va schimba! Astăzi vom învăța cum să interacționăm cu adevărat cu programul: îl vom învăța cum să răspundă la acțiunile noastre! Înainte de a începe să analizăm codul, ați avut vreodată de a face cu un dispozitiv precum un scanner? Probabil. Interiorul unui scaner este destul de complicat, dar ideea de bază a modului în care funcționează este foarte simplă: citește datele pe care utilizatorul le oferă (cum ar fi un pașaport sau o poliță de asigurare) și stochează aceste informații în memorie (de exemplu, sub formă de imagine). ). Astăzi îți vei crea propriul scaner! Desigur, nu va putea gestiona documente pe hârtie, dar textul nu va fi nicio problemă pentru el :) Hai să mergem!

Clasa de scanare Java

Clasa scanner - 1În primul rând, trebuie să ne familiarizăm cu clasa java.util.Scanner . Funcționalitatea sa este foarte simplă. Ca un scaner real, citește date dintr-o sursă pe care o specificați. De exemplu, un șir, un fișier, consola. Apoi, recunoaște informațiile și le procesează în mod corespunzător. Iată cel mai simplu exemplu:
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);
   }
}
Am creat un obiect scaner și am specificat sursa de date a acestuia (un șir de text). Metoda nextLine() accesează sursa de date (textul nostru cu un quatrain), găsește următoarea linie necitită (care este prima linie în acest caz) și o returnează. Apoi îl afișăm pe consolă: Ieșire consolă:
It matters not how strait the gate,
Putem folosi metoda nextLine() de mai multe ori și putem afișa întregul fragment de poezie:
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);
   }
}
De fiecare dată, scanerul nostru face un pas înainte și citește următorul rând. Ieșirea programului este afișată:
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
După cum am spus deja, sursa de date a scanerului nu trebuie să fie un șir. De exemplu, ar putea fi consola. Câteva știri interesante pentru tine: anterior, doar afișam datele acolo, dar acum vom citi datele de pe tastatură! Să vedem ce mai face clasa 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);

   }
}
Metoda nextInt() citește și returnează numărul introdus. În programul nostru, îl folosim pentru a atribui o valoare variabilei număr . Deja seamănă mai mult cu un scanner adevărat! Programul cere utilizatorului să introducă orice număr. După ce utilizatorul a făcut acest lucru, programul îi mulțumește utilizatorului, afișează rezultatul și termină. Dar mai avem o problemă serioasă. Utilizatorul poate greși și introduce ceva greșit. Iată un exemplu în care programul nostru actual nu mai funcționează:
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);

   }
}
Să încercăm să introducem șirul „CodeGym” în loc de un număr: Ieșire consolă:
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. Avem mari probleme -_- Pentru a evita astfel de situații, trebuie să găsim o modalitate de a verifica datele introduse de utilizator. De exemplu, dacă utilizatorul introduce altceva decât un număr, ar fi bine să afișeze un avertisment că informația introdusă nu este un număr. Și dacă informațiile sunt în regulă, atunci am putea confirma. Dar acest lucru ne-ar cere să „privim în viitor” pentru a vedea ce urmează în fluxul nostru. Scannerul poate face asta? Si cum! Și are o mulțime de metode pentru a face acest lucru: hasNextInt() — Această metodă verifică dacă următoarea bucată de date de intrare este un număr (returnează adevărat sau fals, după caz). hasNextLine() — Această metodă verifică dacă următoarea bucată de intrare este un șir. hasNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Toate aceste metode efectuează verificări similare pentru tipurile de date rămase. Să încercăm să schimbăm programul nostru de citire a numerelor:
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!");
       }

   }
}
Acum programul nostru verifică dacă următorul caracter introdus este un număr. Și afișează confirmarea doar dacă este. Dacă intrarea nu trece de verificare, programul ia notă și îi cere utilizatorului să încerce din nou. Practic, puteți comunica cu obiectul Scanner și puteți afla dinainte ce tip de date vă așteaptă. Un număr, șir sau altceva? Un număr? Și ce fel? Un int , short , long ?" Această flexibilitate vă oferă posibilitatea de a construi logica de program care depinde de comportamentul utilizatorului. Ar trebui să ținem cont de o altă metodă importantă: useDelimiter() . Transmiteți un șir acestei metode. Șirul conține caracterele pe care doriți să le utilizați ca separatori sau delimitatori. De exemplu, să presupunem că am devenit brusc interesați de poezia japoneză și am decis să folosim scanerul nostru pentru a citi niște haiku scrise de marele poet Matsuo Bashō. Chiar dacă trei versete diferite ne sunt transmise ca un șir ciudat, le putem împărți cu ușurință și le putem reda frumos:
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();
   }
}
Folosim „\ n /*/*/*” (caracter de linie nouă și trei asteriscuri) ca delimitator. Ca rezultat, avem o ieșire frumoasă de consolă, la fel ca în cărți:
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.
Acest exemplu are încă o metodă pe care trebuie neapărat să o subliniem: close() . La fel ca orice obiect care lucrează cu fluxuri I/O, scanerul trebuie să fie închis când se termină, astfel încât să nu mai consume resursele computerului. Nu uita niciodată metoda close() !
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!

   }
}
Asta este! După cum puteți vedea, pentru cât de utilă este, clasa Scanner este destul de ușor de utilizat! :) Pentru a consolida ceea ce ați învățat, vă sugerăm să urmăriți o lecție video de la Cursul nostru Java
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu