© 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
Scarica

slide della lezione - ppt - 157 KB