Il package java.io e i flussi - UNISA · 2005-05-12 · Il package java.io e i flussi 2 Il package...

30
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 flussi Di dati binari (byte stream) Di caratteri (character stream) Ciascun tipo di flusso è gestito da apposite classi

Transcript of Il package java.io e i flussi - UNISA · 2005-05-12 · Il package java.io e i flussi 2 Il package...

Page 1: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 2: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 3: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 4: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 5: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

}

}

Page 6: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 7: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 8: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 9: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 10: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 11: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 12: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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:

Page 13: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

}

}

Page 14: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 15: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 16: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 17: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 18: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 19: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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:

Page 20: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 21: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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:

Page 22: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 23: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 24: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 25: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 26: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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);

Page 27: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 28: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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

Page 29: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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");

Page 30: Il package java.io e i flussi - UNISA · 2005-05-12 · 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

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