Operazioni di input/output Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni
Input /Output introduzione Per ottenere delle informazioni un programma apre un flusso (Stream) su una sorgente di informazione (la tastiere,un file la memoria o la rete) e legge le informazioni come una sequenza di byte 2
Allo stesso modo un programma può inviare informazioni ad una destinazione aprendo un flusso (Stream) su una destinazione di informazione (il Monitor,un file, la memoria o la rete) e scrivere le informazioni sequenzialmente. 3
Package java.io Il package java.io contiene una vastissima collezione di oggetti per usare gli stream. Essi sono catalogati in due gerarchie di categorie : 4
Streams di caratteri 5
Streams di byte 6
Il package java.io Flussi di input: hanno una sorgente Per dati binari, usare la classe InputStream Per caratteri, usare la classe Reader Flussi di output: hanno una destinazione Per dati binari, usare la classe OutputStream Per caratteri, usare la classe Writer Tutte queste classi sono nel package java.io Per usarle import java.io.*; 7
Input/output in Java La classe System Definisce 3 flussi standard 1. in per la tastiera 2. out per il monitor 3. err per gli errori indirizzato ancora sul monitor 8
System.in: oggetto di tipo InputStream Metodi: Public Int read(void) throws IOException Legge un singolo carattere, ritorna il carattere letto o -1 se si raggiunge la fine dello stream public int read(char[ ] cbuf, int offset, int length) throws IOException Legge lenght caratteri e li memorizza nel buffer cbuf a partire dall indirizzo offset Ritorna il numero di caratteri letti o -1 se fine stream 9
System.out: Oggeto di tipo OutputStream Metodi: Public void print(dato) throws IOException Dato può essere uno dei tipi primitivi o una stringa o un oggetto. public void println(dato) throws IOException Dato può essere uno dei tipi primitivi o una stringa o un oggetto. In più va a capo. 10
Operazioni di Input/Output Utilizzando gli oggetti InputStream e OutputStream possiamo fare operazioni soddifacenti per l output. Nelle operazioni di input spesso occorre leggere una stringa infatti anche un numero ad esempio 134 èuna stringa costituita dai singoli caratteri 1 3 e 4 che poi diventeranno valore numerico mediante conversione. 11
La classe BufferedReader Questa classe mette a disposizione dei metodi per leggere in modo bufferizzato. Cioè non singoli caratteri ma sequenze di caratteri terminati da invio. Questa classe mette a disposizione tra gli altri il seguente metodo: public String readline() throws IOException Legge una riga d testo 12
Utilizzare la classe BufferedReader Bisogna innanzitutto creare un oggetto di tipo InputStreamReader: InputStreamReader isr= new InputStreamReader(System.in) in pratica si crea un oggetto lettore di flusso collegato alla tastiera (System.in) BufferedReader bd= new Buffered Reader(isr); e con il lettore di flusso si crea un lettore bufferizzato A questo punto sarebbe possibile leggere una linea di testo String linea; linea=bd.readline(); 13
Le Eccezioni Un eccezione è un comportamento errato o anomalo che si presenta mentre un programma è in esecuzione. Per esempio division by zero (arithmetic exception) leggere un numero con la virgola quando ne è previsto uno intero (number format exception) scrivere su un file che non esiste (I/O exception) fare riferimento ad un carattere inesistente di una stringa (index out of bounds exception). Java mette a disposizione un sofisticato metodo di gestione di eventuali mal funzionamenti individuando quando è pssibile una sorgente di malfunzionamento. In questi casi ci obbliga a gestire una eccezione mediante un costrutto chiamato try catch. 14
Utilizzo di try.. catch In pratica il concetto può essere spiegato dicendo che dove è previsto un mal fnzionamento non eseguo l istuzione ma provo (try) ad esguirla e se si verifica un mal funzionamento catturo (catch) il messaggio che java mi invia. In pratica il codice di prima dobbiamo scriverlo: String linea; InputStreamReader isr= new InputStreamReader(System.in); BufferedReader bd= new Buffered Reader(isr); try { linea = bd.readline(); } catch (IOException e) { e.printstacktrace(); } 15
Gestione dell input output Per quanto visto precedentemente nella programmazione java è sempre conveniente suddividere il proprio programma in almeno due oggetti: Un user interface object Un computational object 16
Gestione dell input output Ad esempio in una applicazione console application la nostra applicazione potrebbe essere schemtizzata come nella figura seguente 17
Esempio di interfaccia di input/output import java.io.*; public class IO { private BufferedReader reader; public IO() { reader = new BufferedReader (new InputStreamReader(System.in)); } public String gettastierastring() { return readtastiera();} public int gettastierainteger() { return Integer.parseInt(readTastiera());} public double gettastieradouble() { return Double.parseDouble(readTastiera());} public void display(string s) { System.out.print(s); } private String readtastiera() { String line = ""; try { line = reader.readline(); } catch (IOException e) { e.printstacktrace();} return line; } } 18