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 Prof. Francesco Accarino Operazioni di Input/Output 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. Prof. Francesco Accarino Operazioni di Input/Output 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 : Prof. Francesco Accarino Operazioni di Input/Output 4 Streams di caratteri Prof. Francesco Accarino Operazioni di Input/Output 5 Streams di byte Prof. Francesco Accarino Operazioni di Input/Output 6 Il package java.io Flussi di input: hanno una sorgente Flussi di output: hanno una destinazione Per dati binari, usare la classe InputStream Per caratteri, usare la classe Reader 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.*; Prof. Francesco Accarino Operazioni di Input/Output 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 Prof. Francesco Accarino Operazioni di Input/Output 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 Prof. Francesco Accarino Operazioni di Input/Output 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. Prof. Francesco Accarino Operazioni di Input/Output 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 . Prof. Francesco Accarino Operazioni di Input/Output 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 Prof. Francesco Accarino Operazioni di Input/Output 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(); Prof. Francesco Accarino Operazioni di Input/Output 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. Prof. Francesco Accarino Operazioni di Input/Output 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(); } Prof. Francesco Accarino Operazioni di Input/Output 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 Prof. Francesco Accarino Operazioni di Input/Output 16 Gestione dell’input output Ad esempio in una applicazione console application la nostra applicazione potrebbe essere schemtizzata come nella figura seguente Prof. Francesco Accarino Operazioni di Input/Output 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; } } Prof. Francesco Accarino Operazioni di Input/Output 18