© M. Badella G. Malnati, 2003-04 Input/Output Programmazione ad Oggetti A.A. 2004-05 © M. Badella, G. Malnati, L. Tessitore 2003-05 Argomenti della lezione Flussi di dati Lettura e scrittura Interagire con il file system File ad accesso casuale Programmazione ad Oggetti 2 © M. Badella, G. Malnati, L. Tessitore 2003-05 Flussi di dati Sequenze continue e monodirezionali di informazioni che transitano da un’entità ad un’altra Attraverso un flusso possono scorrere dati di qualsiasi tipo: Omogenei / eterogenei Semplici / composti Un programma costituisce la sorgente o la destinazione di un flusso L’altra estremità può essere un altro programma, il disco, lo schermo o la tastiera, … ad Oggetti Programmazione 3 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi Java per I/O Modellano l’interazione di un programma con flussi dati Ingresso o uscita Binari o testuali Organizzate in una struttura di ereditarietà Le sottoclassi estendono e specializzano le funzionalità base Fanno capo al package java.io Programmazione ad Oggetti 4 © M. Badella, G. Malnati, L. Tessitore 2003-05 Struttura generale InputStream OutputStream Binario Reader Ingresso Testuale Programmazione ad Oggetti Writer Uscita 5 © M. Badella, G. Malnati, L. Tessitore 2003-05 InputStream Modella le operazioni di lettura da un flusso binario Opera su sequenze di byte Classe astratta Offre metodi per leggere i singoli byte Tutti i metodi possono lanciare IOException Programmazione ad Oggetti 6 © M. Badella, G. Malnati, L. Tessitore 2003-05 Metodi principali int read() Attende il prossimo byte, dopodiché ne restituisce il valore (0-255) Ritorna -1 se il flusso è terminato int available() Ritorna il numero di byte leggibili senza attesa Programmazione ad Oggetti 7 © M. Badella, G. Malnati, L. Tessitore 2003-05 Metodi principali long skip(long n) Scarta i prossimi “n” byte dal flusso, se esistono Ritorna il numero di caratteri scartati void close() Chiude il flusso e rilascia le risorse di sistema associate Occorre ricordarsi di chiamarlo! Programmazione ad Oggetti 8 © M. Badella, G. Malnati, L. Tessitore 2003-05 Sorgenti InputStream offre funzionalità minimali: Non indica da dove provengano i dati letti Sottoclassi “sorgente” Modellano la lettura di byte da supporti specifici File, array di byte, StringBuffer, … Programmazione ad Oggetti 9 © M. Badella, G. Malnati, L. Tessitore 2003-05 FileInputStream Permette di leggere il contenuto di un file Parametro del costruttore Deve esistere ed essere leggibile Lettura sequenziale Dall’inizio alla fine Programmazione ad Oggetti 10 © M. Badella, G. Malnati, L. Tessitore 2003-05 Esempio FileInputStream fis; String filename= “prova.dat”; try { fis= new FileInputStream(filename); int i; while ( (i=fis.read()) != -1) { byte b= (byte) i; //Opera sul dato… } } finally { fis.close(); } Programmazione ad Oggetti 11 © M. Badella, G. Malnati, L. Tessitore 2003-05 Filtri InputStream offre funzionalità minimali: Permette solo di leggere byte Classi “filtro” Arricchiscono le funzionalità o le prestazioni, interponendosi ad altre sorgenti o filtri Programmazione ad Oggetti 12 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi filtro Richiedono un InputStream da cui prelevare i dati Deve essere passato nel costruttore Trasformano i dati letti da tale flusso Conversione di formato, memoria tampone, reinserimento, … Programmazione ad Oggetti 13 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi filtro BufferedInputStream bis; bis=new BufferedInputStream( new FileInputStream(“file.dat”) ); byte b=bis.read(); b=bis.read(); File InputStream read() … Programmazione ad Oggetti File 14 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi filtro BufferedInputStream bis; bis=new BufferedInputStream( new FileInputStream(“file.dat”) ); byte b=bis.read(); b=bis.read(); Buffered InputStream read() … is buf count Programmazione ad Oggetti File InputStream read() … File byte[] 15 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi filtro BufferedInputStream bis; bis=new BufferedInputStream( new FileInputStream(“file.txt”) ); byte b=bis.read(); b=bis.read(); Buffered InputStream read() … is buf count Programmazione ad Oggetti File InputStream read() … File byte[] 16 © M. Badella, G. Malnati, L. Tessitore 2003-05 Classi filtro BufferedInputStream bis; bis=new BufferedInputStream( new FileInputStream(“file.txt”) ); byte b=bis.read(); b=bis.read(); Buffered InputStream read() … is buf count Programmazione ad Oggetti File InputStream read() … File byte[] 17 © M. Badella, G. Malnati, L. Tessitore 2003-05 Composizione Il meccanismo dei filtri è molto flessibile Più filtri possono essere concatenati (in che ordine?) Si possono costruire oggetti con tutte e sole le funzionalità richieste Programmazione ad Oggetti 18 © M. Badella, G. Malnati, L. Tessitore 2003-05 Gerarchia di ereditarietà Input Stream File InputStream ByteArray Sequence InputStream InputStream Filter InputStream StringBuffer Buffered Data Pushback InputStream Programmazione ad Oggetti InputStream InputStream InputStream 19 © M. Badella, G. Malnati, L. Tessitore 2003-05 OutputStream Modella le operazioni di scrittura su un flusso binario Classe astratta Offre metodi per scrivere i singoli byte Tutti i metodi possono lanciare IOException Programmazione ad Oggetti 20 © M. Badella, G. Malnati, L. Tessitore 2003-05 Metodi principali void write(int b) Scrive il valore b (troncato ad 8 bit) sul flusso void flush() Forza l’invio effettivo di byte temporaneamente accodati all’interno dell’oggetto void close() Chiude il flusso e rilascia le risorse di sistema associate Una volta chiuso, il flusso non può essere riaperto né può ricevere ulteriori dati Occorre ricordarsi di chiamarlo Programmazione ad Oggetti 21 © M. Badella, G. Malnati, L. Tessitore 2003-05 Destinazioni Anche OutputStream offre funzionalità minimali: Non indica dove scrivere i dati letti Sottoclassi “destinazione” Modellano la scrittura di byte su supporti specifici File, array di byte, … Programmazione ad Oggetti 22 © M. Badella, G. Malnati, L. Tessitore 2003-05 FileOutputStream Permette di scrivere un file Parametro del costruttore Può non esistere Occorre poterlo creare / modificare (diritto di scrittura) Scrittura sequenziale Dall’inizio alla fine Il contenuto precedente viene cancellato Programmazione ad Oggetti 23 © M. Badella, G. Malnati, L. Tessitore 2003-05 Esempio FileOutputStream fos; String filename= “prova.dat”; try { fos= new FileOutputStream(filename); //Esempio di scrittura… for (int i=0; i<=255; i++) fos.write( (byte) i); } finally { fos.close(); } Programmazione ad Oggetti 24 © M. Badella, G. Malnati, L. Tessitore 2003-05 Filtri Insieme di classi che estendono le capacità di OutputStream Inserimento di un buffer Scrittura di dati elmentari ed oggetti Scrittura di sequenze di caratteri ASCII Programmazione ad Oggetti 25 © M. Badella, G. Malnati, L. Tessitore 2003-05 Gerarchia di ereditarietà Output Stream File OutputStream ByteArray Object OutputStream Filter Piped OutputStream OutputStream OutputStream Buffered Data Print OutputStream Programmazione ad Oggetti OutputStream Stream 26 © M. Badella, G. Malnati, L. Tessitore 2003-05 Reader & Writer Classi duali di InputStream e OutputStream Modellano operazioni su flussi di caratteri UNICODE Classi astratte Rispetto ai flussi binari, cambiano i tipi dei parametri Programmazione ad Oggetti 27 © M. Badella, G. Malnati, L. Tessitore 2003-05 Gerarchia di ereditarietà Reader Buffered Filter Reader CharArray Reader Reader InputStream Reader String Reader File Reader Programmazione ad Oggetti 28 © M. Badella, G. Malnati, L. Tessitore 2003-05 Gerarchia di ereditarietà Writer Buffered Print Writer CharArray Writer Writer OutputStream Writer String Writer File Writer Programmazione ad Oggetti 29 © M. Badella, G. Malnati, L. Tessitore 2003-05 Codifica dei caratteri Un carattere UNICODE è rappresentato su 16 bit Esistono vari modi per trasformarlo in una sequenza di byte InputStreamReader e OutputStreamWriter hanno, all’interno, il codice necessario alla conversione in byte Nel costruttore si può indicare la codifica da adottare Programmazione ad Oggetti 30 © M. Badella, G. Malnati, L. Tessitore 2003-05 Leggere da console BufferedReader br; try { br= new BufferedReader( new InputStreamReader(System.in) ); String s=br.readLine(); … } finally { br.close(); } Programmazione ad Oggetti 31 © M. Badella, G. Malnati, L. Tessitore 2003-05 La classe File Modella il nome di file e cartelle in modo indipendente dal sistema operativo: Il file corrispondente può non esistere Permette di creare, cancellare, rinominare, … file e cartelle Programmazione ad Oggetti 32 © M. Badella, G. Malnati, L. Tessitore 2003-05 Creazione e cancellazione boolean createNewFile(); boolean mkdir(); boolean renameTo(File dest); boolean delete(); void deleteOnExit(); Programmazione ad Oggetti 33 © M. Badella, G. Malnati, L. Tessitore 2003-05 Proprietà di un file boolean canRead(); boolean canWrite(); boolean isDirectory(); boolean isFile(); File getParentFile(); long length(); String[] list(); Programmazione ad Oggetti 34 © M. Badella, G. Malnati, L. Tessitore 2003-05 Ulteriori funzionalità static File[] listRoots(); Elenca le possibili radici del filesystem corrente (“a:”, “c:”, …) static String separator; Indica il carattere che separa il nome di cartelle e file (‘\’ o ‘/’) Programmazione ad Oggetti 35 © M. Badella, G. Malnati, L. Tessitore 2003-05 Esempio File dir= new File(“c:\”, “temp”); boolean b; if (!dir.exists()) b=dir.mkdir(); else b=dir.isDirectory(); if (b) { String[] nomi= dir.list(); //… } Programmazione ad Oggetti 36 © M. Badella, G. Malnati, L. Tessitore 2003-05 File ad accesso casuale In alcune situazioni occorre operare su un file, procedendo in modo non sequenziale Lettura e scrittura possono avvenire in qualsiasi posizione del file indipendentemente dall’operazione precedente La classe RandomAccessFile modella il file come fosse un array di byte Memorizzato su disco, invece che in memoria Mantiene un puntatore di posizione interno che tiene traccia del prossimo byte a cui accedere o Modificabile dal programmatore È possibile operare sia in lettura che in scrittura o Si specifica in fase di costruzione Programmazione ad Oggetti 37 © M. Badella, G. Malnati, L. Tessitore 2003-05 File ad accesso casuale DataInput DataOutput RandomAccessFile read( ) write( ) seek( pos ) … File pos File Posizione in cui avverrà la prossima operazione Programmazione ad Oggetti 38 © M. Badella, G. Malnati, L. Tessitore 2003-05 Operare in lettura void seek(long pos) Posiziona il puntatore interno a pos byte dall’inizio del file long getFilePointer( ) Restituisce la posizione corrente del puntatore interno rispetto all’inizio del file String readLine( ) Legge una sequenza di caratteri ASCII terminata da newline e la converte in formato Unicode String readUTF( ) Legge una sequenza di caratteri Unicode codificati nel formato UTF-8 (che contiene la lunghezza della stringa) Altri metodi dell’interfaccia DataInput Permettono di leggere tipi elementari (numeri interi, numeri in virgola mobile, caratteri e booleani) Programmazione ad Oggetti 39 © M. Badella, G. Malnati, L. Tessitore 2003-05 Operare in scrittura void writeBytes(String s) Scrive la sequenza di byte meno significativi corrispondenti ai caratteri contenuti in “s” void writeChars(String s) Scrive la sequenza di caratteri (due byte ciascuno) contenuti in “s” void writeUTF(String s) Scrive la rappresentazione della stringa “s” nel formato UTF-8 Altri metodi dell’interfaccia DataOutput Permettono la scrittura di dati elementari Programmazione ad Oggetti 40