Un InputStreamReader è un canale che trasforma flussi di byte in flussi di caratteri: legge byte e li trasforma in caratteri utilizzando un set di caratteri, questo può essere esplicitamente specificato per nome o può essere riferito implicitamente, di default.
Ad ogni richiesta di lettura mediante un metodo di InputStreamReader vengono letti uno o più byte dal flusso di byte di ingresso.
Per massimizzare l'efficienza, si faccia seguire al canale di InputStreamReader, il canale BufferedReader. Per esempio
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Legge il testo proveniente da un flusso di caratteri, memorizzando i caratteri allo scopo di fornirne la rappresentazione, il formato e le linee del testo.
In questo paragrafo vengono presentati gli oggetti e i metodi per le operazioni di input e output utilizzando un'interfaccia a caratteri. II linguaggio java, essendo nato in un periodo in cui l'uso delle interfacce a finestre si era ormai consolidato, mette a disposizione molti strumenti utili per costruire interfacce grafiche.
Per scrivere sul video si usa un'istruzione come la seguente:
System.out.println("messaggio");
System.out rappresenta un oggetto associato allo standard output Esiste anche un oggetto associato allo standard error che è System.err. Entrambi fanno riferimento per default allo schermo.
Un messaggio può essere consegnato all'oggetto System.out tramite il metodo println(), il parametro di println rappresenta il valore da visualizzare. Il parametro può essere una stringa, un numero intero o reale, un carattere o un booleano. Quando il metodo println() viene richiamato, stampa sul video il parametro e inserisce un ritorno a capo. Con l'oggetto System.out è possibile utilizzare anche il metodo print(): esso stampa il parametro passato, ma non stampa il ritorno a capo. I metodi print() e println() ricevono un unico parametro, ma utilizzando l'operatore + è possibile concatenare stringhe e numeri.
Scrivere un programma che consenta di stampare il valore di 3 variabili: un numero intero, un numero reale e un booleano.
Creare un nuovo progetto.
public class Stampa {
public static void main(String[] args) {
// TODO code application logic here
int intero = 5;
float reale = 25.68f;
boolean trovato = false;
System.out.println("Numero intero: " + intero);
System.out.println("Numero reale: " + reale);
System.out.println("Valore booleano: " + trovato);
}
}
Il risultato dell'esecuzione di questo programma è:
Numero Intero = 5 Numero reale = 25:68 Trovato = false
Nella dichiarazione del numero reale è stata aggiunta la lettera f dopo il numero. Infatti il solo numero sarebbe interpretato come un numero di tipo double che non può essere assegnato a una variabile di tipo float. L'aggiunta della lettera f equivale ad effettuare un casting. In alternativa si può effettuare la dichiarazione anche in questo modo:
float reale = (float) 25.68;
Per le operazioni di input esiste un oggetto analogo System.in che gestisce il flusso di dati inseriti da tastiera. L'oggetto System.in, in pratica, viene mascherato con altri oggetti pił potenti che forniscono maggiori funzionalità.
Si utilizza la classe BufferedReader nel seguente modo:
InputStreamReader input = new InputStreamReader(System.in); BufferedReader tastiera = new BufferedReader(input);
Con queste dichiarazioni viene definito un oggetto tastiera, di classe BufferedReader, usando l'operatore new che crea un nuovo oggetto.
La classe BufferedReader mette a disposizione il metodo readline() che consente di leggere, in questo caso da standard input, una riga per volta. Una linea viene considerata terminata quando viene premuto il tasto di Invio. Questo metodo restituisce solo stringhe, quindi se si vogliono acquisire valori numerici, si deve effettuare la conversione da stringhe e numeri.
Per effettuare la lettura di una stringa si deve dichiarare una variabile di tipo stringa e poi usare il metodo readLine() con l'oggetto tastiera definito in precedenza.
String nome; nome = tastiera.readLine();
L'operazione deve essere completata considerando le eccezioni che possono essere generate dal metodo readLine(). L'eccezione segnala una situazione anomala. Quando si verifica un'eccezione bisogna prevedere un blocco di istruzioni per gestire questa situazione. Il blocco dell'eccezione è realizzato con il costrutto try {} catch {}. Quindi la lettura di una stringa si effettua correttamente nel seguente modo:
String nome: try { nome = tastiera.readLine(); } catch(Exception e) {}
II segmento di codice precedente stabilisce che, al verificarsi dell'eccezione, non deve essere effettuata alcuna operazione.
Per effettuare la lettura di numeri, occorre convertire la stringa ottenuta dall'operazione di input nel seguente modo:
String leggiNumero; int num; try { leggiNumero = tastiera.readLine(); num = Integer.valueOf(leggiNumero).intValue(); } catch(Exception e) { System.out.println("\nNumero non corretto!"); return; }
L'struzione aggiuntiva consente di convertire una stringa in un numero intero, attraverso due metodi della classe Integer: uno converte il parametro stringa in un oggetto di classe Integer, l'altro metodo restituisce un valore intero. In questo caso, l'eccezione che può essere generata si verifica quando i caratteri inseriti non corrispondono a cifre numeriche. Se per esempio si inseriscono i valori 34f5 oppure 45.45, essi non vengono riconosciuti come interi e quindi provocano un'eccezione che causa la terminazione del programma.
Per leggere un numero espresso in virgola mobile, occorre cambiare il modo di conversione. Per esempio, se si vuole ottenere un valore float, si deve scrivere:
numFloat = Float.valueOf(leggiNumero).floatValue();
In modo dei tutto analogo, per ottenere un valore double:
numDouble = Double.valueOf(leggiNumero).doubleValue();
La prima riga del programma (import java.io.*;) serve per richiamare la libreria java.io, che contiene le classi InputStreamReader e BufferedReader usate per leggere dallo standard input.
Quando si verifica un'eccezione durante la lettura, viene mostrato un messaggio di errore e l'istruzione return interrompe l'esecuzione del metodo main, causando la fine del programma.