© 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