Sei sulla pagina 1di 32

Capitolo 13 Gli stream

c 2005 Pearson Education Italia

Capitolo 13 -

1 / 56

Sommario: Gli stream


1

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 2 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 3 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 4 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 6 / 56

Flussi di byte e di caratteri

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

Flussi di caratteri (character stream)


Lunit` a di informazione gestita sono caratteri Unicode (16-bit). I/O testuale Sono divisi in reader e writer

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 7 / 56

Esempio: la classe FileReader

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.

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 9 / 56

La classe FileReader: metodi


public int read() throws IOException Legge un singolo carattere dallo stream che esegue il metodo e ne restituisce il codice sotto forma di intero compreso tra 0 e 65535 (i numeri interi rappresentabili con 16 bit). Se si ` e raggiunta la ne del le, il metodo restituisce 1. public int read(char[] buf) throws IOException Legge dallo stream che esegue il metodo una sequenza di caratteri della stessa lunghezza dellarray specicato come argomento e li memorizza nelle posizioni successive dellarray. public void close() throws IOException Chiude lo stream che esegue il metodo. Devessere invocato per rilasciare la risorsa, cio` e il le cui ` e collegato lo stream. Una volta che lo stream ` e stato chiuso, eventuali invocazioni di un metodo read (o di altri metodi che eseguano operazioni sullo stream) sollevano leccezione IOException.
c 2005 Pearson Education Italia Capitolo 13 - Gli stream 11 / 56

Esempio: visualizzazione di un le di caratteri


import prog.io.*; import java.io.FileReader; import java.io.IOException; public class VisualizzaFile { public static void main(String[] args) throws IOException { ConsoleOutputManager out = new ConsoleOutputManager(); //costruzione dello stream di caratteri FileReader frd = new FileReader(args[0]); int i; //lettura e visualizzazione while ((i = frd.read()) != -1) out.print((char)i); //chiusura dello stream frd.close(); } } c 2005 Pearson Education Italia
Capitolo 13 - Gli stream 13 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 15 / 56

Classi ltro: BufferedReader


Permette di leggere testo da uno stream di caratteri fornendo un meccanismo di buerizzazione. Questo: rende pi` u eciente il processo di lettura dallo stream permette di organizzare le sequenze di caratteri provenienti dallo stream in strutture pi` u complesse.

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

Esempio: visualizzazione di un le di caratteri


import import import import prog.io.*; java.io.FileReader; java.io.IOException; java.io.BufferedReader;

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

Sommario: Gli stream


1

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 20 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 22 / 56

Flussi di caratteri in input: gerarchia

StringReader CharArrayReader InputStreamReader Reader FilterReader PipedReader BufferedReader LineNumberReader PushbackReader FileReader

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 24 / 56

Flussi di caratteri in output: gerarchia

StringWriter CharArrayWriter OutputStreamWriter Writer FilterWriter PipedWriter BufferedWriter PrintWriter FileWriter

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 26 / 56

Sommario: Gli stream


1

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 27 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 29 / 56

Sommario: Gli stream


1

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 30 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 32 / 56

Flussi di byte in input: gerarchia

FileInputStream PipedInputStream FilterInputStream InputStream ByteArrayInputStream SequenceInputStream StringBufferInputStream ObjectInputStream LineNumberInputStream DataInputStream BufferedInputStream PushBackInputStream

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 34 / 56

Flussi di byte in output: gerarchia

FileOutputStream FilterOutputStream OutputStream ByteArrayOutputStream PipedOutputStream ObjectOutputStream

DataOutputStream BufferedOutputStream PrintStream

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 36 / 56

Scrivere dati primitivi su stream di byte


Contratto
La classe PrintStream (estensione di OutputStream) consente di convertire dati primitivi in sequenze di byte.

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)

La corrispondente versione println


c 2005 Pearson Education Italia Capitolo 13 - Gli stream 38 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 40 / 56

I ussi di I/O Standard

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)

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 42 / 56

Scrivere e leggere oggetti

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 44 / 56

Scrivere e leggere oggetti


Serializzazione Il processo che consiste nel convertire la rappresentazione di un oggetto in un usso di byte La classe ObjectOutputStream Fornisce metodi per convertire un oggetto o un dato primitivo in una sequenza di byte per poi inviarlo lungo un OutputStream. Deserializzazione Il processo di ricostruzione di un oggetto a partire da un usso di byte La classe ObjectInputStream Fornisce metodi per convertire una sequenza di byte proveniente da un InputStream in un oggetto o in dato primitivo.

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 46 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 48 / 56

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() ...

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 50 / 56

Scrivere e leggere oggetti

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 52 / 56

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

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 54 / 56

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 { ... }

c 2005 Pearson Education Italia

Capitolo 13 - Gli stream 56 / 56

Potrebbero piacerti anche