JavaRush /Java Blog /Random-IT /Classe scanner in Java

Classe scanner in Java

Pubblicato nel gruppo Random-IT
Ciao! La nostra lezione di oggi sarà speciale! Prima di questo, quando si risolvevano problemi e si scrivevano programmi, l'algoritmo era semplice: scriviamo del codice, eseguiamo il metodo main() , il programma fa ciò che gli viene richiesto ed esce. Ma ora tutto cambierà! Oggi impareremo come interagire veramente con il programma: gli insegneremo a rispondere alle nostre azioni! Potresti già capire dove stiamo andando. Dedicheremo questa lezione ad un'analisi dettagliata di una delle classi del linguaggio Java: Scanner. Questa classe sarà utile se hai bisogno di leggere i dati immessi dagli utenti. Prima di passare all'apprendimento del codice, dimmi, ti sei mai imbattuto in un dispositivo come uno scanner? Sicuramente sì. La struttura interna dello scanner è piuttosto complessa, ma l'essenza del suo lavoro è piuttosto semplice: legge i dati che l'utente inserisce (ad esempio un passaporto o una polizza assicurativa) e memorizza le informazioni lette in memoria (ad esempio , sotto forma di immagine). Quindi oggi creerai il tuo scanner! Ovviamente non è in grado di gestire i documenti, ma può gestire abbastanza bene le informazioni di testo :) Andiamo!Classe scanner - 1

Classe di scanner Java

La prima e più importante cosa che dobbiamo conoscere è la classe java.util.Scanner. La sua funzionalità è molto semplice. Come un vero scanner, legge i dati dalla fonte specificata. Ad esempio, da una riga, da un file, dalla console. Quindi riconosce queste informazioni e le elabora secondo necessità. Facciamo l'esempio più semplice:
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);
   }
}
Abbiamo creato un oggetto scanner e specificato un'origine dati per esso (una stringa con testo). Il metodo nextLine()accede alla fonte dati (il nostro testo con quartine), trova lì la riga successiva che non ha ancora letto (nel nostro caso, la prima) e la restituisce. Dopodiché lo trasmettiamo alla console: Console output:

Люблю тебя, Peterа творенье,
Possiamo utilizzare il metodo nextLine()più volte e produrre l'intero brano della poesia:
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);
   }
}
Ogni volta il nostro scanner farà un passo avanti e leggerà la riga successiva. Il risultato del programma viene inviato alla console:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Come abbiamo già detto, la fonte dati per lo scanner può essere non solo una stringa, ma anche, ad esempio, una console. Novità importanti per noi: se prima emettevamo i dati solo lì, ora li inseriremo dalla tastiera! Vediamo cos'altro può fare la classe 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);

   }
}
Il metodo nextInt()legge e restituisce il numero immesso. Nel nostro programma viene utilizzato per assegnare un valore a una variabile number. Sembra più un vero scanner! Il programma chiede all'utente di inserire qualsiasi numero in una riga. Dopo che l'utente ha fatto ciò, il programma lo ringrazia, visualizza il risultato del suo lavoro sulla console e termina. Ma abbiamo ancora un problema serio. L'utente potrebbe commettere un errore e inserire qualcosa di sbagliato. Ecco un esempio di quando il nostro programma attuale smetterebbe di funzionare:
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);

   }
}
Proviamo a inserire la stringa "JavaRush" invece di un 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
Ops, va tutto male -_- Per evitare tali situazioni, dobbiamo trovare un modo per convalidare i dati inseriti dall'utente. Ad esempio, se l'utente inserisce qualcosa di diverso da un numero, sarebbe carino visualizzare nella console un avviso che l'informazione inserita non è un numero e, se tutto è in ordine, visualizzare un testo di conferma. Ma per fare questo, dobbiamo “guardare al futuro” – scoprire cosa ci aspetta nel nostro flusso. Scanner in Java può fare questo? Come può! E per questo dispone di un intero gruppo di metodi: hasNextInt()- il metodo controlla se la porzione successiva dei dati inseriti è un numero oppure no (restituisce rispettivamente vero o falso). hasNextLine()— controlla se il dato successivo è una stringa. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- tutti questi metodi fanno lo stesso per altri tipi di dati. Proviamo a cambiare il nostro programma per leggere i numeri:
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!");
       }

   }
}
Ora il nostro programma controlla se il successivo carattere inserito è un numero oppure no. E solo se lo è, viene visualizzata una conferma. Se l'input non supera il test, il programma se ne accorge e ti chiede di riprovare. In sostanza, puoi comunicare con l'oggetto Scanner e sapere in anticipo che tipo di dati aspettarti. “Ehi, scanner, cosa c'è dopo? Numero, stringa o qualcos'altro? Numero? E quale int... short? long" Questa flessibilità ti dà l'opportunità di costruire la logica del tuo programma in base al comportamento dell'utente. Un altro metodo importante a cui vale la pena prestare attenzione è useDelimiter(). A questo metodo viene passata la stringa che si desidera utilizzare come delimitatore. Ad esempio, ci siamo improvvisamente interessati alla poesia giapponese e abbiamo deciso di utilizzare lo scanner per leggere diversi haiku del grande poeta Matsuo Basho. Anche se ci vengono dati tre versi diversi in una riga goffa, possiamo facilmente separarli e formattarli bene:
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();
   }
}
Utilizziamo il metodo useDelimeter() della classe Scanner come separatore di riga : è responsabile della divisione dei dati in arrivo in parti. Nel nostro caso, una virgoletta singola ( "'" ) viene passata come argomento e utilizzata per separare le stringhe . Il testo che segue questa citazione appare su una nuova riga perché nel ciclo while stiamo usando il metodo println() della classe System per leggere i dati. Di conseguenza, avremo un bellissimo output sulla console, proprio come nei libri:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Nello stesso esempio, c'è un altro metodo a cui dovresti assolutamente prestare attenzione: close(). Come ogni oggetto che funziona con flussi di I/O, lo scanner dovrebbe essere chiuso una volta completato il suo lavoro per non consumare più le risorse del nostro 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 the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
È tutto! Come puoi vedere, la classe Scanner è abbastanza facile da usare e molto utile! :)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION