Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Capitolo 13 -
1 / 56
Introduzione agli stream Flussi di byte e di caratteri Esempio: la classe FileReader Le classi ltro Stream di caratteri La classe File Flussi di byte La classe PrintStream Scrivere e leggere oggetti Linterfaccia Serializable
2 3 4
Flussi di Input
Per ricevere in ingresso dei dati, unapplicazione apre uno stream collegato a una sorgente di informazioni (le, memoria, socket,...) da cui legge sequenzialmente le informazioni.
lettura Applicazione I N F O R M A Z I O N I
Sorgente
Flussi di Output
Per esportare informazioni, unapplicazione apre uno stream verso una destinazione (le, memoria, socket,... ) e vi scrive sequenzialmente le informazioni.
scrittura Applicazione I N F O R M A Z I O N I
Destinazione
Reading e di Wrinting
I processi di lettura/scrittura possono essere sintetizzati nel modo seguente: Lettura
creazione dello stream while (ci sono informazioni da leggere) leggi chiusura dello stream
Scrittura
creazione dello stream while (ci sono informazioni da scrivere) scrivi chiusura dello stream
Il pacchetto java.io ` e composto da due sezioni principali: Flussi di byte (byte stream)
Lunit` a di informazione gestita ` e il byte (8-bit). I/O binario: immagini, dati in formato binario. . . Sono divisi in input stream e output stream
Contratto: FileReader
Classe di utilit` a per leggere le di caratteri.
Costruttore
public FileReader(String nomeFile) throws FileNotFoundException Crea un oggetto per leggere uno stream di caratteri collegato con il le il cui nome ` e specicato come argomento. Se il le con tale nome non esiste, il metodo solleva leccezione controllata FileNotFoundException.
Le classi ltro
Il package java.io fornisce un insieme di classi che permettono di organizzare le informazioni che provengono da uno stream scomporre informazioni strutturate da inviare a uno stream
Metodi
public String readLine() throws IOException Legge una linea di testo. Una linea ` e considerata conclusa dai caratteri \n (linefeed), \r (carriage return) o da un carriage return seguito da un linefeed. Se al momento dellinvocazione del metodo non si ` e raggiunta la ne dello stream, il metodo restituisce la stringa contenente la linea di caratteri letta (senza il carattere di terminazione della riga). Se invece al momento dellinvocazione ` e stata raggiunta la ne dello stream, il metodo restituisce null.
c 2005 Pearson Education Italia Capitolo 13 - Gli stream 17 / 56
public class VisualizzaFile { public static void main(String[] args) throws IOException { ConsoleOutputManager out = new ConsoleOutputManager(); FileReader frd = new FileReader(args[0]); BufferedReader bfr = new BufferedReader(frd); String str; //lettura e visualizzazione while ((str = bfr.readLine()) != null) out.println(str); //chiusura dello stream bfr.close(); frd.close(); } } c 2005 Pearson Education Italia
Capitolo 13 - Gli stream 19 / 56
Introduzione agli stream Flussi di byte e di caratteri Esempio: la classe FileReader Le classi ltro Stream di caratteri La classe File Flussi di byte La classe PrintStream Scrivere e leggere oggetti Linterfaccia Serializable
2 3 4
I ussi di caratteri
Sono canali di comunicazione collegati con sorgenti o destinazioni attraverso i quali i caratteri viaggiano in sequenza Le varie classi che li realizzano si distinguono per il tipo di sorgente o destinazione con cui possono dialogare Sorgenti/destinazioni diverse richiedono implementazione diverse. I metodi per la lettura e scrittura di caratteri sono comunque gli stessi e sono deniti in due classi astratte del package java.io
Reader Writer
StringReader CharArrayReader InputStreamReader Reader FilterReader PipedReader BufferedReader LineNumberReader PushbackReader FileReader
Introduzione agli stream Flussi di byte e di caratteri Esempio: la classe FileReader Le classi ltro Stream di caratteri La classe File Flussi di byte La classe PrintStream Scrivere e leggere oggetti Linterfaccia Serializable
2 3 4
Collegamento con un le
Gli oggetti di tipo File consentono di creare un collegamento con il le sico Consentono di trattare nomi di le e directory (pathname gerarchici) in modo astratto e indipendente dal sistema I sistemi operativi utilizzano pathname dipendenti dal sistema per attribuire un nome ai le e alle directory La classe File fornisce una rappresentazione astratta ed indipendente dal sistema dei pathname gerarchici
Introduzione agli stream Flussi di byte e di caratteri Esempio: la classe FileReader Le classi ltro Stream di caratteri La classe File Flussi di byte La classe PrintStream Scrivere e leggere oggetti Linterfaccia Serializable
2 3 4
I ussi di byte
Sono canali di comunicazione collegati con sorgenti o destinazioni attraverso i quali i byte viaggiano in sequenza. Le varie classi che realizzano gli stream di byte si distinguono per il tipo di sorgente o destinazione con cui possono dialogare Sorgenti/destinazioni diverse richiedono implemetazioni diverse I metodi per la lettura e scrittura di byte sono comunque gli stessi e sono deniti in due classi astratte del package java.io
InputStream OutputStream
FileInputStream PipedInputStream FilterInputStream InputStream ByteArrayInputStream SequenceInputStream StringBufferInputStream ObjectInputStream LineNumberInputStream DataInputStream BufferedInputStream PushBackInputStream
Costruttore
public PrintStream(OutputStream out) Crea un print stream verso loutput stream specicato.
Metodi
void void void void void print(boolean b) print(int i) print(long l) print(float f) print(double d) void void void void print(char c) print(char[] s) print(String s) print(Object obj)
Esempio
File file = new File(nomefile); FileOutputStream fos = new FileOutputStream(file); PrintStream ps = new PrintStream(fos); ps.println("Provo valori di vario tipo"); ps.println(100); ps.println(3/4.0); ps.println(true && false);
I riferimenti a standard input, standard output e standard error sono disponibili mediante campi statici della classe java.lang.System
public static final InputStream in Standard input (tastiera) public static final PrintStream out Standard output (video) public static final PrintStream err Standard error (video)
In molte applicazioni risulta utile scambiare oggetti in formato binario, senza passare per una conversione del formato Java fornisce a questo scopo degli strumenti per scrivere su uno stream di byte e leggere da uno stream byte direttamente degli oggetti Ogni classe che implementa linterfaccia Serializable pu` o essere trasformata in una sequenza di byte che pu` o essere successivamente ricomposta a formare loggetto originale
ObjectOutputStream
Costruttore
public ObjectOutputStream(OutputStream out) throws IOException Crea un ObjectOutputStream che scrive sullOutputStream specicato.
Metodi
public final void writeObject(Object obj) throws IOException Scrive uno specico oggetto sullObjectOutputStream. Metodi per scrivere dati primitivi: writeDouble(double data) writeFloat(float data) writeInt(int data) writeLong(long data) ...
ObjectInputStream
Costruttore
public ObjectInputStream(InputStream in) throws IOException Crea un ObjectInputStream che legge dallInputStream specicato.
Metodi
public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException Legge un oggetto dallObjectInputStream. Metodi per leggere dati primitivi: double readDouble() float readFloat() int readInt() long readLong() ...
Scrittura
FileOutputStream out = new FileOutputStream("dataOdierna"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Data di oggi:"); s.writeObject(new Data()); s.flush();
Lettura
FileInputStream in = new FileInputStream("dataOdierna"); ObjectInputStream s = new ObjectInputStream(in); String oggi = (String)s.readObject(); Date date = (Date)s.readObject();
La serializzazione va richiesta
Gli oggetti non sono automaticamente serializzabili Un oggetto pu` o contenere dati che non si vuole siano accessibili dallesterno (come una password)
Una volta serializzata e, ad esempio memorizzata su le, tale informazione pu` o essere recuperata anche se nella classe originale era dichiarata privata.
Per poter scrivere (o leggere) gli oggetti di una classe questa deve dichiarare esplicitamente di ammettere la serializzazione implementando linterfaccia marker Serializable
Serializable
Si tratta di uninterfaccia priva di metodi e costanti (interfaccia marker) Per rendere una classe serializzabile ` e suciente dichiarare che implementa linterfaccia Serializable; non occorre implementare alcun metodo
import java.io.Serializable; public class MiaClasse implements Serializable { ... }