Input Lettura di dati in input Finestra di dialogo Finestra di dialogo

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 all’utente di inserire una stringa e
possiamo trattare l’oggetto 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 l’input:
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 dall’utente:
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
L’utente è libero di digitare qualunque cosa nel
campo di input
Poi potrà fare click sui pulsanti OK o Annulla
Se l’utente fa click su Annulla viene restituito il
valore null e la variabile String input varrà
quindi null
Se l’utente 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
l’utente 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 l’input 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 l’input
Ottenere l’input
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 l’oggetto
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 un’oggetto della classe
InputStream
Possiamo quindi usare System.in
La bora torio di P rogra mma zione - Luca Te s e i
12
Ottenere l’input
Ottenere l’input
InputStreamReader reader = new
InputStreamReader(System.in);
BufferedReader console = new
BufferedReader(reader);
• reader può restituire l’input 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 nell’oggetto reader di
tipo InputStreamReader, al costruttore e
ottenere l’oggetto riferito da console
13
La bora torio di P rogra mma zione - Luca Te s e i
Ottenere l’input
14
Ottenere l’input
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 l’input
IOException
A questo punto:
String input = console.readLine();
Aspetta fino a quando l’utente 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 l’inserimento 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 un’eccezione se la stringa passata non
contiene le cifre di un intero
Anche il metodo readLine della classe
BufferedReader può sollevare un’eccezione se
qualcosa va storto con il reperimento dell’input
L’eccezione è del tipo IOException
L’eccezione IOException è un’eccezione 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 l’eccezione 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