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