CodeGym/Java Blog/Random-IT/Classe Scanner Java
John Squirrels
Livello 41
San Francisco

Classe Scanner Java

Pubblicato nel gruppo Random-IT
membri
CIAO! La nostra lezione di oggi sarà speciale! Nella lezione di oggi parleremo di Java Scanner Class. In precedenza, il processo di completamento delle attività e di scrittura dei programmi era semplice: scriviamo del codice, eseguiamo il main()metodo, il programma esegue ciò che è richiesto e il gioco è fatto. Ma ora tutto cambierà! Oggi impareremo come interagire davvero con il programma: gli insegneremo a rispondere alle nostre azioni! Prima di iniziare ad analizzare il codice, hai mai avuto a che fare con un dispositivo come uno scanner? Probabilmente. L'interno di uno scanner è piuttosto complicato, ma l'idea di base di come funziona è molto semplice: legge i dati forniti dall'utente (come un passaporto o una polizza assicurativa) e memorizza queste informazioni in memoria (ad esempio, come un'immagine ). Oggi creerai il tuo scanner! Ovviamente non sarà in grado di gestire documenti cartacei, ma il testo non sarà un problema :) Andiamo!

Classe Scanner di Java

Classe scanner - 1Innanzitutto, dobbiamo conoscere la classe java.util.Scanner . La sua funzionalità è molto semplice. Come un vero scanner, legge i dati da una fonte specificata. Ad esempio, una stringa, un file, la console. Successivamente, riconosce le informazioni e le elabora in modo appropriato. Ecco l'esempio più semplice:
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);
   }
}
Abbiamo creato un oggetto scanner e specificato la sua origine dati (una stringa di testo). Il metodo nextLine() accede all'origine dati (il nostro testo con una quartina), trova la successiva riga non letta (che in questo caso è la prima riga) e la restituisce. Quindi lo visualizziamo sulla console: Console output:
It matters not how strait the gate,
Possiamo usare il metodo nextLine() più volte e visualizzare l'intero estratto della poesia:
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);
   }
}
Ogni volta, il nostro scanner fa un passo avanti e legge la riga successiva. Viene visualizzato l'output del programma:
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
Come abbiamo già detto, l'origine dati dello scanner non deve essere una stringa. Ad esempio, potrebbe essere la console. Alcune notizie entusiasmanti per te: in precedenza, visualizzavamo solo i dati lì, ma ora leggeremo i dati dalla tastiera! Vediamo cos'altro fa la classe 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);

   }
}
Il metodo nextInt() legge e restituisce il numero inserito. Nel nostro programma lo usiamo per assegnare un valore alla variabile number . È già più simile a un vero scanner! Il programma chiede all'utente di inserire qualsiasi numero. Dopo che l'utente ha eseguito questa operazione, il programma ringrazia l'utente, visualizza il risultato e termina. Ma abbiamo ancora un problema serio. L'utente potrebbe commettere un errore e inserire qualcosa di sbagliato. Ecco un esempio in cui il nostro programma attuale smette di funzionare:
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);

   }
}
Proviamo ad inserire nella stringa "CodeGym" invece un 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. Siamo in grossi guai -_- Per evitare tali situazioni, dobbiamo trovare un modo per verificare i dati inseriti dall'utente. Ad esempio, se l'utente immette qualcosa di diverso da un numero, sarebbe bene visualizzare un avviso che le informazioni immesse non sono un numero. E se l'informazione va bene, allora potremmo confermare. Ma questo ci richiederebbe di "guardare al futuro" per vedere cosa sta arrivando nel nostro flusso. Lo scanner può farlo? E come! E ha una serie di metodi per farlo: hasNextInt() — Questo metodo controlla se il blocco successivo di dati di input è un numero (restituisce true o false, a seconda dei casi). hasNextLine() — Questo metodo verifica se il blocco successivo di input è una stringa. haNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Tutti questi metodi eseguono controlli simili per i restanti tipi di dati. Proviamo a cambiare il nostro programma di lettura dei numeri:
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!");
       }

   }
}
Ora il nostro programma verifica se il carattere successivo inserito è un numero. E visualizza la conferma solo se lo è. Se l'input non supera il controllo, il programma prende nota e chiede all'utente di riprovare. Fondamentalmente, puoi comunicare con l' oggetto Scanner e scoprire in anticipo quale tipo di dati ti aspetta. Un numero, una stringa o qualcos'altro? Un numero? E che tipo? An int , short , long ?" Questa flessibilità ti dà l'opportunità di costruire la logica del programma che dipende dal comportamento dell'utente. Dovremmo prendere nota di un altro metodo importante: useDelimiter() . Passi una stringa a questo metodo. La stringa contiene il caratteri che si desidera utilizzare come separatori o delimitatori. Ad esempio, supponiamo che improvvisamente ci interessiamo alla poesia giapponese e decidiamo di utilizzare il nostro scanner per leggere alcuni haiku scritti dal grande poeta Matsuo Bashō. Anche se tre diversi versi ci vengono trasmessi come una corda scomoda, possiamo facilmente dividerli e renderli magnificamente:
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();
   }
}
Usiamo "\ n /*/*/*" (carattere di nuova riga e tre asterischi) come delimitatore. Di conseguenza, abbiamo un bellissimo output per console, proprio come nei libri:
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.
Questo esempio ha un metodo in più che dobbiamo assolutamente sottolineare: close() . Come ogni oggetto che lavora con i flussi di I/O, lo scanner deve essere chiuso quando ha finito in modo che smetta di consumare le risorse del computer. Non dimenticare mai il metodo 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!

   }
}
Questo è tutto! Come puoi vedere, per quanto sia utile, la classe Scanner è abbastanza facile da usare! :) Per rafforzare ciò che hai imparato, ti suggeriamo di guardare una lezione video dal nostro corso Java
Commenti
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti