Sei sulla pagina 1di 14

Linput da tastiera in Java

Dott. Ing. M. Banci, PhD


) La lettura di un flusso di input in Java avviene attraverso
l'oggetto in della classe System.
) System.in appartiene alla classe InputStream
(letteralmente flusso di input) la quale mette a disposizione un
unico metodo, chiamato read(), il quale legge e restituisce un
byte dallo stream di input (flusso di ingresso).
) Per leggere un numero intero, un numero in virgola mobile, una
stringa o qualsiasi altro tipo di dato, necessario eseguire una
conversione di tipo.
) Il modo pi comodo e di gran lunga pi utilizzato dai
programmatori Java, anche se non particolarmente efficiente,
quello di far uso del metodo readLine() messo a disposizione
dalla classe BufferedReader.
) BufferedReader una classe dedicata alla lettura di buffers
(sequenze di caratteri), che il metodo readLine() restituisce
sotto forma di stringhe.
) La classe BufferedReader, a sua volta, deve essere
inizializzata fornendo un reader (lettore) di stream di input. Tale
lettore rappresentato da un'instanza della classe
InputStreamReader.
15 Giugno 2007 Esercitazione Java - 4 2
) L'utilit di un lettore quella di trasformare la
sequenza di byte letti tramite l'oggetto System.in
(o generalmente tramite un qualsiasi oggetto di tipo
InputStream) in una sequenza di caratteri.
Secondo gli standard dello schema Unicode adottato
Java infatti, un carattere rappresentato da due byte.

) Cerchiamo di rendere pi chiara la situazione


spiegando una ad una le operazioni che necessario
fare per leggere una sequenza di byte da un oggetto
di tipo InputStream e trasformarli in una stringa.

15 Giugno 2007 Esercitazione Java - 4 3


) L'oggetto System.in, di tipo InputStream,
consente di leggere uno ad uno, una sequenza di
byte.
) Trattare con un flusso di byte pu risultare complicato
e sicuramente poco pratico. E' molto pi comodo far
uso di un lettore bufferizzato in grado di gestire
autonomamente un flusso di byte e convertirlo in un
flusso di caratteri. Un lettore bufferizzato pu essere
creato instanziando un oggetto della classe
BufferedStreamReader nel seguente modo:

15 Giugno 2007 Esercitazione Java - 4 4


BufferedStreamReader reader = new
BufferedStreamReader (System.in);

) A questo punto faremo uso del lettore


bufferizzato che abbiamo chiamato reader
per instanziare un oggetto di tipo
BufferedReader. Quest'ultimo mette a
disposizione del programmatore il metodo
readLine() che consente la lettura di intere
stringhe.
15 Giugno 2007 Esercitazione Java - 4 5
Per instanziare un oggetto di tipo BufferedReader
scriveremo:

BufferedReader myInput = new


BufferedReader (reader);

Abbiamo cos definito un nuovo oggetto chiamato myInput


sul quale possiamo richiamare il metodo readLine() per
leggere una stringa in input dalla tastiera nel seguente modo:

str = new String (myInput.readLine());

15 Giugno 2007 Esercitazione Java - 4 6


) La classe BufferedReader, che abbiamo utilizzato
per definire l'oggetto myInput, non una classe
dedicata alla lettura di input da tastiera, bens una
classe generica con la quale si possono leggere
flussi di dati provenienti da varie fonti (file, altri
computer collegati in rete...).
) Per questo motivo alcuni dei metodi definiti nella
classe BufferedReader, tra cui readLine(),
prevedono la possibilit che si possa verificare un
malfunzionamento.
) Per malfunzionamento intendiamo ad esempio, la
lettura di un file riservato, condizioni di stallo della
rete, o in genere una qualsiasi situazione che
interrompa il flusso di dati in input.

15 Giugno 2007 Esercitazione Java - 4 7


) Quando si verifica un evento di questo genere, la funzione
interessata segnala quanto accaduto all'applicazione principale
tramite il lancio di un'eccezione.
) Uneccezione un segnale inviato da un metodo per segnalare
qualcosa che non ha funzionato correttamente. Esistono
eccezioni diverse per problemi diversi.
) Nel nostro caso, la funzione readLine() pu generare
eccezioni di tipo IOException, cio eccezioni riguardanti il
sistema di input-output.
) Un'applicazione che faccia uso di una funzione che pu
generare eccezioni deve necessariamente essere in grado di
gestire le eventuali eccezioni segnalate.
) Il problema viene risolto inserendo queste funzioni in un blocco
try - catch

15 Giugno 2007 Esercitazione Java - 4 8


try - catch

try {
istruzione1;
} catch (TipoEccezione) {
istruzioniDiRecupero;
}

15 Giugno 2007 Esercitazione Java - 4 9


) Sostanzialmente pu essere
tradotto in prova ad eseguire
istruzione1, se qualcosa va
storto allora esegui
istruzioniDiRecupero
) Mettiamo insieme quanto detto
fino ad ora e vediamo come
scrivere un programma che legga
una stringa in input dalla tastiera.
15 Giugno 2007 Esercitazione Java - 4 10
import java.io.InputStreamReader;
import java.io.BufferedReader ;
import java.io.IOException;

public class LeggiStringa {

public static void main (String[] args)


{
InputStreamReader reader = new InputStreamReader
(System.in);
BufferedReader myInput = new BufferedReader
(reader);
String str= new String();
try {
str = myInput.readLine();
} catch (IOException e) {
System.out.println ("Si verificato un
errore: " + e);
System.exit(-1);
}
System.out.println ("Hai scritto: "+str);
}
}
15 Giugno 2007 Esercitazione Java - 4 11
Nel blocco che abbiamo precedentemente chiamato
IstruzioniDiRecupero compaiono due istruzioni:
1. visualizza il tipo di eccezione che si verificata
2. termina l'esecuzione del programma richiamando il metodo
System.exit().
Il parametro passato al metodo exit() il codice restituito dal processo
una volta terminato.
Generalmente i processi che terminano correttamente restituiscono zero
(0). Il numero -1, restituito in questo caso segnala che il processo
terminato in quanto si verificato un errore.
Per leggere numeri interi e/o in virgola mobile sufficiente convertire la
stringa letta in un numero intero tramite il metodo parseInt(), o in un
numero in virgola mobile tramite il metodo parseDouble(), entrambi
appartenenti alla classe String.

15 Giugno 2007 Esercitazione Java - 4 12


Convertire stringhe in numeri

int k;
k = str.parseInt();

nel primo caso e:

double k;
k = str.parseDouble();

15 Giugno 2007 Esercitazione Java - 4 13


)Sar consigliabile prima
accertarsi che i dati immessi
dall'utente sotto forma di
stringa possano essere
effettivamente convertiti nel
tipo di dato desiderato.

15 Giugno 2007 Esercitazione Java - 4 14