View
3
Download
0
Category
Preview:
Citation preview
Il package java.io e i flussi
2
Il package java.io
In Java input e output sono definiti in termini di flussi (stream)
Sequenze ordinate di dati
Due tipi di flussiDi dati binari (byte stream)Di caratteri (character stream)
Ciascun tipo di flusso è gestito daapposite classi
3
Il package java.ioFlussi di input: hanno una sorgente
Per dati binari, usare la classe InputStream
Per caratteri, usare la classe Reader
Flussi di output: hanno unadestinazione
Per dati binari, usare la classe OutputStream
Per caratteri, usare la classe Writer
Tutte queste classi sono nel package java.io
import java.io.*;
4
La classe IOException
Utilizzata da molti metodi di java.ioper segnalare condizioni eccezionali
Un metodo solleva una IOExceptionse si verifica un problema collegato al flusso di I/O
5
Flussi Standard Definiti dalla classe System in java.lang
Standard input (tastiera): System.in
Di tipo InputStream
Standard output (monitor): System.out
Di tipo PrintStream
Standard error (per messaggi di errore): System.err
Di tipo PrintStream
6
La classe astratta InputStream
Dichiara i metodi per leggere flussibinari da una sorgente specifica
Alcuni metodi:
public abstract int read() throws IOException
public void close() throws IOException
7
Il metodo read
Legge un byte alla voltaRestituisce
un int (da 0 a 255) che rappresenta il byte letto-1 se il file è terminato
Alla fine bisogna chiudere il flusso di inputCon il metodo close()
8
Il metodo close
Chiude il flusso di input
Rilascia le risorse associate al flusso
Ulteriori operazioni sul flusso chiusoprovocano una IOException
9
La classe FileInputStream
Sottoclasse concreta di InputStreampublic class FileInputStream extends InputStream
Possiamo creare oggetti di questaclasse
FileInputStream in = new FileInputStream(“nomefile.est");
10
Esempio: Contare i byte in un flussoimport java.io.*;
public class ContaByte {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(“nomefile.est”);
int totale = 0;
while (in.read() != -1)
totale++;
in.close();
System.out.println(“Il numero di byte è + ” totale);
}
}
11
Specificare il path di un file
Quando si digita il path di un file ognibarra rovesciata va inserita due volte
Una singola barra rovesciata è un caratterespeciale!
InputStream in = new FileInputStream(“C:\\nomedir\\nomefile.est”);
12
La classe astratta OutputStream
Dichiara i metodi per scrivere flussibinari in una destinazione specifica
Alcuni metodi:
public abstract void write(int b) throws IOException
public void close() throws IOException
13
Il metodo write
Scrive un byte alla volta
Il byte è passato come argomento di tipo int
Alla fine bisogna chiudere il flusso di outputCon il metodo close()
14
Il metodo close
Chiude il flusso di output
Rilascia le risorse associate al flusso
Ulteriori operazioni sul flusso chiusoprovocano una IOException
15
La classe FileOutputStream
Sottoclasse concreta di OutputStreampublic class FileOutputStream extends OutputStream
Possiamo creare oggetti di questaclasse
FileOutputStream out = new FileOutputStream(“nomefile.est");
16
La classe astratta Reader
Dichiara i metodi per leggere flussi di caratteri da una sorgente specifica
Alcuni metodi:
public int read() throws IOException
public abstract void close() throws IOException
17
Il metodo read
Legge un carattere alla voltaRestituisce
un int (da 0 a 65535) che rappresenta ilcarattere letto-1 se il file è terminato
Alla fine bisogna chiudere il flusso di caratteri
Con il metodo close()
18
Il metodo close
Chiude il flusso di caratteri
Rilascia le risorse associate al flusso
Ulteriori operazioni sul flusso chiusoprovocano una IOException
19
Conversione tra flussiPossiamo convertire un flusso di input binario in un flusso di input di caratteri
Usiamo la classe InputStreamReaderE’ una sottoclasse concreta di ReaderIl costruttore èpublic InputStreamReader(InputStream in)
20
Conversione tra flussiDato che l’oggetto System.in è di tipoInputStream, possiamo convertirlo in un flusso di caratteri
InputStreamReader reader= new
InputStreamReader(System.in);
In generale:
InputStream in = new FileInputStream(“nomefile.est");
InputStreamReader reader= new InputStreamReader(in);
21
Usare un InputStreamReaderGli oggetti della classe InputStreamReader
leggono un carattere per volta, ma spesso
serve leggere intere linee.
Abbiamo bisogno di un oggetto che compone
stringhe a partire dai caratteri letti da un
InputStreamReader
Possiamo usare la classe BufferedReaderÈ una sottoclasse di Reader
22
Creare un BufferedReaderUsiamo il costruttore
public BufferedReader(Reader in)
Per creare un oggetto che compone stringhe con i caratteri letti da un InputStreamReader, dobbiamo passare l’oggetto di tipo InputStreamReader al costruttore della classe BufferedReader
BufferedReader buf= new BufferedReader(reader);
23
La classe BufferedReader offre varimetodi, tra cui String readLine() throws IOException
Legge un carattere alla volta fino ad ottenere unalinea
Quando i dati sono terminati restituisce null
Usare un BufferedReader
24
InputStream in = new FileInputStream (“file.est");
InputStreamReader reader = new InputStreamReader(in);
BufferedReader buf = new BufferedReader(reader);
//leggi i dati
String inputLine = buf.readLine();
Ricapitolando:
25
La classe FileReader
Sottoclasse di InputStreamReaderpublic class FileReader extends InputStreamReader
Possiamo creare oggetti di questa classeFileReader reader = new FileReader(“nomefile.txt");
26
Esempio: Contare i caratteri in un flussoimport java.io.*;
public class ContaCaratteri {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader(“nomefile.txt”);
int totale = 0;
while (reader.read() != -1)
totale++;
reader.close();
System.out.println(“Il numero di caratteri è + ” totale);
}
}
27
Usare un FileReaderGli oggetti della classe FileReader
leggono un carattere per volta, ma spesso
serve leggere intere linee.
Abbiamo bisogno di un oggetto che compone
stringhe a partire dai caratteri letti da un
FileReader
Possiamo usare la classe BufferedReader
28
Creare un BufferedReaderUsiamo il costruttore
public BufferedReader(Reader in)
Per creare un oggetto che compone stringhe con i caratteri letti da un FileReader, dobbiamo passare l’oggetto di tipo FileReader al costruttore della classe BufferedReader
BufferedReader buf= new BufferedReader(reader);
29
FileReader reader = new FileReader(“file.txt");
BufferedReader buf = new BufferedReader(reader);
//leggi i dati
String inputLine = buf.readLine();
Ricapitolando:
30
La classe astratta Writer
Dichiara i metodi per scrivere flussi di caratteri in una destinazione specifica
Alcuni metodi:
public void write(int ch) throws IOException
public abstract void close() throws IOException
31
Il metodo write
Scrive un carattere alla volta
Il carattere è passato come argomento di tipo int
Alla fine bisogna chiudere il flusso di caratteri
Con il metodo close()
32
Il metodo close
Chiude il flusso di caratteri
Rilascia le risorse associate al flusso
Ulteriori operazioni sul flusso chiusoprovocano una IOException
33
Conversione tra flussiPossiamo convertire un flusso di output binario in un flusso di output di caratteri
Usiamo la classe OutputStreamWriterE’ una sottoclasse concreta di WriterIl costruttore èpublic OutputStreamWriter(OutputStreamout)
34
Conversione tra flussiL’oggetto System.out è di tipo PrintStream
PrintStream è sottoclasse di FilterOutputStreamFilterOutputStream è sottoclasse di OutputStream
Possiamo convertire lo standard output in un flusso di caratteri
OutputStreamWriter writer= new OutputStreamWriter(System.out);
In generale:OutputStream out = new FileOutputStream(“nomefile.est");
OutputStreamWriter writer= new OutputStreamWriter(out);
35
Usare un OutputStreamWriterGli oggetti della classe OutputStreamWriter
scrivono un carattere per volta, ma spesso
serve scrivere intere linee.
Abbiamo bisogno di un oggetto che compone
stringhe a partire dai caratteri scritti da un
OutputStreamWriter
Possiamo usare la classe PrintWriterÈ una sottoclasse di Writer
36
Creare un PrintWriterUsiamo il costruttore
public PrintWriter(OutputStream out)
Spezza numeri e stringhe in singoli caratteri
Passiamo l’oggetto di tipo OutputStreamWriter al costruttore della classe PrintWriter
PrintWriter print= new PrintWriter(writer);
37
La classe PrintWriter offre varimetodi, tra cui void println(double x) throws IOException
void println(String s) throws IOException
void println(Object obj) throws IOException
Tali metodi invocano toString per avere unarappresentazione in formato stringa degli oggetti
Usare un PrintWriter
38
OutputStream out = new FileOutputStream(“nomefile.est");
OutputStreamWriter writer= new OutputStreamWriter(out);
PrintWriter print= new PrintWriter(writer);
//scrivi i dati
print.println(“prova di scrittura”);
Ricapitolando:
39
La classe FileWriter
Sottoclasse di OutputStreamWriterpublic class FileWriter extends OutputStreamWriter
Possiamo creare oggetti di questa classeFileWriter writer = new FileWriter(“file.txt");
40
Usare un FileWriterGli oggetti della classe FileWriter
scrivono un carattere per volta, ma spesso
serve scrivere intere linee.
Possiamo usare la classe PrintWriter
41
Creare un PrintWriterUsiamo il costruttore
public PrintWriter(OutputStream out)
Passiamo l’oggetto di tipo FileWriter al costruttore della classe PrintWriter
PrintWriter print = new PrintWriter(writer);
42
FileWriter writer = new FileWriter(“file.txt");
PrintWriter print = new PrintWriter(writer);
//scrivi i dati
print.println(“prova di scrittura”);
Ricapitolando:
43
La classe FileFornisce varie operazioni per manipolare file già esistenti
Creiamo un oggetto di tipo File
File inputFile = new File("input.txt");
Non possiamo leggere direttamente dati da un oggetto di tipo File
Dobbiamo costruire un oggetto di tipoFileReader
FileReader reader = new FileReader(inputFile);
44
public boolean delete()
Cancella il file restituendo true se la cancellazione ha successo
public boolean renameTo(File newname);
Rinomina il file restituendo true se la cancellazione ha successo
public long length()
Restituisce la lunghezza del file in byte (zero se il file non esiste)
La classe File: alcuni metodi
45
import java.io.*;
public class Esempio {
public static void main(String[] args) throws IOException {
// SCRIVERE
FileWriter fw = new FileWriter("C:\\HelloWorld.txt");
PrintWriter pw = new PrintWriter(fw);
pw.println("HELLO WORLD alla fine del file");
/* Chiusura File */
pw.close();
Ricapitoliamo con un esempio
46
// LEGGERE
FileReader fr = new FileReader(“C:\\HelloWorld.txt");
BufferedReader br = new BufferedReader(fr);
String s = br.readLine();
/* Chiusura File */
fr.close();
System.out.println(s);
Esempio
47
File f1 = new File("C:\\HelloWorld.txt");
File f2 = new File("C:\\HelloWorld2.txt");
f1.renameTo(f2);
// Attenzione NON crea il file
File f3 = new File("C:\\HelloWorld3.txt");
// Per crearlo dovete darlo ad un Writer
FileWriter fw2 = new FileWriter(f3);
} /* Fine Main */
} /* Fine classe */
Esempio
48
Flussi di Oggetti
Consentono di memorizzare tutte le caratteristiche di un oggetto
Flussi in scrittura
Classe ObjectOutputStream
Tali caratteristiche possono essereautomaticamente ripristinate
Flussi in lettura
Classe ObjectInputStream
49
Vantaggi
Per scrivere un intero oggettoNon dobbiamo prima decomporlo in altra forma
Possiamo fare una sola operazione!
Per leggere un intero oggettoNon dobbiamo leggere i dati separatamente e poi ricomporre l’oggetto
Possiamo fare una sola operazione!
50
Serializzazione
La memorizzazione di oggetti in un flussoviene detta serializzazione
Ogni oggetto riceve un numero di serie nel flusso
Se lo stesso oggetto viene salvato due volte la seconda volta salviamo solo il numero di serie
Due numeri di serie uguali sono interpretati come riferimenti allo stesso oggetto
51
Serializzazione
L’oggetto da inserire nel flusso deveessere serializzabile
Appartenere a una classe che implemental’interfaccia Serializable
Non ha metodi
52
Serializzazione
Per scrivere oggetti di una classe MyClass che implementa Serializable in un flusso di oggetti
MyClass mc = new ……
ObjectOutputStream out = new
ObjectOutputStream(new
FileOutputStream(“mc.dat”));
out.writeObject(mc);
53
Serializzazione
Per leggere oggetti di una classe MyClass che implementa Serializable da un flusso di oggetti
ObjectInputStream in = new
ObjectInputStream(new
FileInputStream(“mc.dat”));
MyClass mc = (MyClass)in.readObject();
54
Serializzazione: readObjectLegge un Object da file
Restituisce un riferimento a tale Object
L’output necessita di un cast MyClass mc = (MyClass)in.readObject();
Può lanciare un’eccezione controllata di tipo ClassCastException
Da catturare o dichiarare in una clausola throws
55
Accesso sequenziale e casuale
Accesso sequenzialeUn file viene elaborato un byte allavolta, in sequenza
Accesso casualePossiamo accedere a posizioniarbitrarie nel file
56
Accesso sequenziale e casuale
57
Accesso sequenziale
Ogni file su disco ha un puntatoredel file posto alla fine del file
Qualsiasi dato viene aggiunto allafine del file
Se il puntatore viene spostato i datisono sovrascritti
58
Accesso casuale
Per spostare il puntatore del file, usiamo un oggetto di tipoRandomAccessFile
Specificando se il file deve essere aperto illettura (“r”) o anche in scrittura (“rw”)
RandomAccessFile f = new RandomAccessFile("bank.dat","rw");
59
Accesso casuale
Spostiamo il puntatore del file con il metodo seek
f.seek(n);
sposta il puntatore al byte in posizione n
f.getFilePointer();
Fornisce la posizione corrente del puntatore del file
Recommended