Luigi Arlotta
a- a+

Leggere l'input da tastiera

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. 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.

  • 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:

            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. 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());
    

     

Ma non finisce qui. 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. Quando si verifica un evento di questo genere, la funzione interessata segnala quanto accaduto all'applicazione principale tramite il lancio di un'eccezione. Il meccanismo delle eccezioni Java verrà analizzato più avanti, per ora vi basti sapere che un eccezione è 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, la cui sintassi è la seguente:

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

}

che 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.


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); } }

 

Nel blocco che abbiamo precedentemente chiamato IstruzioniDiRecupero compaiono due istruzioni; la prima visualizza il tipo di eccezione che si è verificata, la seconda 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.

Abbiamo visto come sia possibile leggere delle stringhe, tuttavia all'inizio del capitolo ci eravamo posti come obbiettivo la lettura oltre che di oggetti di tipo stringa, anche di numeri interi, o in virgola mobile. Per far ciò è 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. Le istruzioni da utilizzare saranno quindi:

int k;
k = str.parseInt();

nel primo caso e:

double k;
k = str.parseDouble();

nel secondo. Ovviamente sarà consigliabile prima accertarsi che i dati immessi dall'utente sotto forma di stringa possano essere effettivamente convertiti nel tipo di dato desiderato.

 

[Pending: assicurarsi che i dati siano convertibili]



Ti potrebbe interessare anche

commenta la notizia

Ci sono 1 commenti
Anonimo
C'è un errore su BufferedStreamReader reader = new BufferedStreamReader (System.in);

dovrebbe essere InputStream....