Input Lettura di dati in input 1. Tramite una finestra grafica di dialogo 2. Tramite lo standard input (la console, ma in generale può essere un qualunque file) Il tipo cha r Alcune moda lità di a cquis izione di input La bora torio di P rogra mma zione - Luca Te s e i I dati in input rendono il programma interattivo e possono fare in modo che il comportamento dello stesso programma sia diverso se vengono dati input diversi 1 La bora torio di P rogra mma zione - Luca Te s e i Finestra di dialogo 2 Finestra di dialogo Possiamo chiedere allutente di inserire una stringa e possiamo trattare loggetto corrispondente nel nostro programma La classe che ci serve per far apparire la finestra è javax.swing.JOptionPane (consultare API) Questa classe ha diversi metodi static showInputDialog che restituiscono un oggetto String Per far apparire la finestra e ottenere linput: String input = JOptionPane.showInputDialog( “Quanti nickel hai?”); La bora torio di P rogra mma zione - Luca Te s e i Vediamo due modi per acquisire dei dati di input dallutente: 3 La stringa che passiamo come parametro sarà visualizzata sulla finestra La bora torio di P rogra mma zione - Luca Te s e i 4 Finestra di dialogo Esempio di uso Lutente è libero di digitare qualunque cosa nel campo di input Poi potrà fare click sui pulsanti OK o Annulla Se lutente fa click su Annulla viene restituito il valore null e la variabile String input varrà quindi null Se lutente fa click su OK viene creato un oggetto String che contiene la stringa inserita e il suo riferimento viene assegnato alla variabile input La bora torio di P rogra mma zione - Luca Te s e i import javax.swing.JOptionPane; public class InputTest { public static void main(String argv[]) { String input = JOptionPane.showInputDialog( "Quanti nickel hai?"); // Utilizzo il metodo parseInt per ottenere // il numero intero digitato int nickels = Integer.parseInt(input); System.out.println(nickels); // Nei programmi che usano la grafica si deve usare // questa chiamata per terminare il programma System.exit(0); } } 5 La bora torio di P rogra mma zione - Luca Te s e i Esempio Il tipo base char Naturalmente si dovrebbe gestire sia il caso in cui lutente fa click su Annulla sia il caso in cui quello che digita non è un intero Ancora non abbiamo gli strumenti per farlo Per adesso ci accontentiamo di un programma che, se qualcosa va storto, termina con errore Ricordarsi sempre di inserire System.exit(0); come ultima istruzione del main, altrimenti il programma resta in esecuzione (il gestore della grafica rappresenta un processo della nostra applicazione che rimane attivo fino a quando non lo si chiude esplicitamente con il metodo static System.exit) La bora torio di P rogra mma zione - Luca Te s e i 6 7 Il tipo base char rappresenta i caratteri Come sappiamo Java gestisce tutto il set di caratteri Unicode Per indicare un carattere basta inserirlo tra due apici singoli: a Ogni sequenza di escape corrisponde a un carattere \n, \t, \u009F Un carattere ha associato un valore numerico reperibile con Character.getNumericValue La bora torio di P rogra mma zione - Luca Te s e i 8 Caratteri e Stringhe Input da console h è un char h è una stringa, quindi un oggetto dello Heap, che contiene un solo carattere h Oltre che da una finestra di dialogo linput può essere prelevato da uno stream di ingresso In Java, così come in C e in altri linguaggi, esiste uno stream apposito per questo che viene chiamato standard input Conosciamo già System.out, che è lo standard output, e sappiamo che è un oggetto della classe java.io.PrintStream Pippo.charAt(0) ritorna il carattere P Nelle stringhe i caratteri sono numerati da 0 in su Pippo.length() ritorna 5, la lunghezza della stringa • System.in è un oggetto della classe java.io.InputStream ed è lo standard input Consultare le API La bora torio di P rogra mma zione - Luca Te s e i 9 La bora torio di P rogra mma zione - Luca Te s e i Ottenere linput Ottenere linput Un oggetto della classe InputStream, quale è System.in, è in grado di leggere un byte per volta dallo stream che rappresenta Non è molto comodo Quello che vorremmo è poter ottenere, come con la finestra di dialogo, una stringa di input Per prima cosa bisogna incapsulare loggetto System.in, di tipo InputStream, in un oggetto della classe java.io.InputStreamReader La bora torio di P rogra mma zione - Luca Te s e i 10 11 Un oggetto della classe InputStreamReader interpreta i byte di un oggetto InputStream come caratteri (tipo base char di Java) È un passo avanti per arrivare al nostro obiettivo I costruttori di questi oggetti richiedono sempre come argomento unoggetto della classe InputStream Possiamo quindi usare System.in La bora torio di P rogra mma zione - Luca Te s e i 12 Ottenere linput Ottenere linput InputStreamReader reader = new InputStreamReader(System.in); BufferedReader console = new BufferedReader(reader); • reader può restituire linput sotto forma di un carattere per volta (guardare le API e scoprire come mai il metodo read restituisce un int piuttosto che un char) Possiamo ottenere di meglio Gli oggetti della classe java.io.BufferedReader possono restituire stringhe formate da caratteri di uno stream di caratteri La bora torio di P rogra mma zione - Luca Te s e i Il costruttore richiede un oggetto della classe java.io.Reader, di cui InputStreamReader è una sottoclasse Possiamo quindi passare il nostro oggetto System.in, incapsulato nelloggetto reader di tipo InputStreamReader, al costruttore e ottenere loggetto riferito da console 13 La bora torio di P rogra mma zione - Luca Te s e i Ottenere linput 14 Ottenere linput Sugli oggetti della classe BufferedReader è possibile chiamare il metodo readLine() che restituisce una stringa contentente una linea di testo Questo è quello che volevamo ottenere Ricapitolando: InputStreamReader reader = new InputStreamReader(System.in); BufferedReader console = new BufferedReader(reader); Oppure BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); La bora torio di P rogra mma zione - Luca Te s e i 15 La bora torio di P rogra mma zione - Luca Te s e i 16 Ottenere linput IOException A questo punto: String input = console.readLine(); Aspetta fino a quando lutente non digita una linea di testo e preme Invio La linea scritta è contenuta nella stringa riferita da input A questo punto possiamo fare il parsing della stringa con i metodi delle classi involucro se ci aspettiamo linserimento di un valore di un certo tipo (es Integer.parseInt) La bora torio di P rogra mma zione - Luca Te s e i Abbiamo già visto che il metodo Integer.parseInt può sollevare uneccezione se la stringa passata non contiene le cifre di un intero Anche il metodo readLine della classe BufferedReader può sollevare uneccezione se qualcosa va storto con il reperimento dellinput Leccezione è del tipo IOException Leccezione IOException è uneccezione che deve essere gestita obbligatoriamente Nel caso non la si voglia gestire si deve esplicitare che il metodo che stiamo scrivendo la può sollevare 17 La bora torio di P rogra mma zione - Luca Te s e i Throws 18 Un programma di esempio import java.io.*; Nel nostro caso il metodo che chiama readLine è il main public class InputDaConsole { public static void main(String argv[]) throws IOException { Siccome ancora non abbiamo visto come gestire leccezione dobbiamo esplicitamente dichiarare che non la gestiamo scrivendo public static void main(String[] argv) throws IOException { BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Quanti nickels hai?"); String input = console.readLine(); int nickels = Integer.parseInt(input); ... System.out.println("Hai scritto " + nickels); } } } La bora torio di P rogra mma zione - Luca Te s e i 19 La bora torio di P rogra mma zione - Luca Te s e i 20 Classe Scanner Esercizio Dalla versione 1.5 della jdk è disponibile una classe java.util.Scanner Uno scanner permette di scorrere/controllare un flusso di caratteri o una stringa riconoscendo interi, float, double o stringhe che fanno match con una data espressione regolare Nella sua versione di default i separatori sono gli spazi bianchi Realizzare un main che: crea un nuovo borsellino richiede in input (usando Scanner e/o standard input) il numero di nickels, dimes e quarters da inserire nel borsellino inserisce tali monete stampa quanti dollari ci sono nel borsellino Si vedano le API per maggiori dettagli La bora torio di P rogra mma zione - Luca Te s e i 21 La bora torio di P rogra mma zione - Luca Te s e i 22