IL PACKAGE java.io Il package java.io definisce quattro

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

INFORMATICA Altre Istruzioni di I/O
Accesso ai dati su file Lab. Sistemi Informativi Economico-Aziendali Accesso ai dati su file Localizzazione dei dati File system locali e distribuiti Protocolli.
Socket Java Alberto Ferrari.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità A2 Java: le basi del linguaggio.
Java Stream e File.
Java Stream e File. La classe File Per operare con lintero file java mette a disposizione la classe File Per utilizzare la classe File è necessario importare.
Costruttori e Distruttori
12/11/2004Laboratorio di Programmazione - Luca Tesei1 Caratteri – Input da Console Il tipo char Input dallo standard input.
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Programmazione in Java (3)
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Fisica Computazionale I - 51 OPERAZIONI DI INPUT/OUTPUT Le operazioni di input/output sono estremamente complesse perche' implicano una sostanziale interazione.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Introduzione agli stream e alle classi
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Scomposizione di stringhe
Overriding.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Java Serialization.
I File.
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
JAVA E LA RETE L’architettura Java è network-ready
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Programmazione in Java
Programmazione in Java (9) Mauro Lorenzutti. 30/09/2005Corso Java - Mauro Lorenzutti2 Scaletta I/O Evoluto Serializzazione Comunicazioni via socket JUnit.
Cosa è una applicazione distribuita?
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Corso JAVA Lezione n° 12 Istituto Statale di Istruzione Superiore “F. Enriques”
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Conversione da base 10 a base X (Utilizzo della pila)
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
ESERCITAZIONE 12 ESERCIZIO 2 14/05/2014. Consegne 1/4 Definire la classe MyBufferedReader che estende la classe BufferedReader, implementando il metodo.
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
Argomenti della lezione
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Input-Output 16 Maggio Nei programmi sviluppati sino ad oggi abbiamo usato * output su schermo (con System.out.print e System.out.print ) * input.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Esercitazione sull’ ordinamento 20 maggio 2003
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
10/10/20021 Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
ESERCITAZIONE Problema Scrivere una funzione che scambi due interi non opera su oggetti  funzione statica scritta dentro a una classe contenitore.
1 Input / Output Spesso un programma deve acquisire dati da una sorgente esterna o inviare informazioni a una destinazione esterna. L’informazione può.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
1 Input / Output Spesso un programma deve acquisire dati da una sorgente esterna o inviare informazioni a una destinazione esterna. L’informazione puo’
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

IL PACKAGE java.io Il package java.io definisce quattro classi base astratte: InputStream e OutputStream per leggere/scrivere stream di byte (come i file binari del C) Reader e Writer per leggere/scrivere stream di caratteri (da Java 1.1 in poi) (come i file di testo del C)

IL PACKAGE java.io Le quattro classi base astratte di java.io Object InputStream Reader OutputStream Writer Le quattro classi base astratte di java.io

IL PACKAGE java.io Tratteremo separatamente prima gli stream di byte InputStream e OutputStream poi gli stream di caratteri Reader e Writer

STREAM DI BYTE La classe base InputStream definisce metodi per: leggere uno o più byte (read()) sapere quanti byte sono disponibili in input (available()) saltare N byte in input (skip()) ricavare la posizione corrente sullo stream (mark()) e tornarci (reset()) , sempreché markSupported() sia vero.

STREAM DI BYTE La classe base OutputStream definisce metodi per: scrivere uno o più byte (write()) svuotare il buffer di uscita (flush()) chiudere lo stream (close())

STREAM DI BYTE Dalle classi base astratte si derivano molte classi concrete che specializzano l’I/O per: I/O da array di byte I/O da file I/O filtrato caso particolare: I/O di tipi primitivi Java (int, float, ...) caso particolare: I/O bufferizzato I/O di oggetti

STREAM DI BYTE

STREAM DI BYTE - INPUT Da InputStream derivano in primis: ByteArrayInputStream l’input è un array di byte, passato al costruttore di ByteArrayInputStream FileInputStream l’input è un file, il cui nome è passato al costruttore di FileInputStream in alternativa si può passare al costruttore un oggetto File costruito a parte, o anche un FileDescriptor

STREAM DI BYTE - INPUT Le altre classi derivate da InputStream hanno come scopo avvolgere un altro InputStream per creare un’entità con funzionalità più evolute. Il loro costruttore ha quindi come parametro un InputStream

STREAM DI BYTE - INPUT Le due classi principali sono: ObjectInputStream legge oggetti serializzati salvati su stream offre metodi per leggere i tipi primitivi e le classi standard (Integer, etc.) di Java FilterInputStream definisce il concetto di “filtro” modifica il metodo read(), e se occorre anche altri, in modo da effettuare le letture in accordo al criterio di filtraggio richiesto in pratica si usano le sue sottoclassi

STREAM DI BYTE - INPUT Le sottoclassi di FilterInputStream: BufferedInputStream modifica il metodo read() in modo da leggere tramite un buffer (che aggiunge) definisce il nuovo metodo readLine(), che però è deprecato in Java 1.1 perché sostituito dalle classi Reader DataInputStream definisce metodi per leggere tipi di dati standard in forma binaria (readInteger(), readFloat(),..)

IL CASO DI System.in L’oggetto statico System.in , lo standard input, è appunto un InputStream viene praticamente sempre “avvolto” (wrapped) in un tipo di InputStream più evoluto per comodità Ad esempio: BufferedInputStream input = new BufferedInputStream(System.in);

STREAM DI BYTE - OUTPUT Da OutputStream derivano in primis: ByteArrayOutputStream l’output è un array di byte interno, dinami-camente espandibile, recuperabile con i metodi toByteArray() o toString(), secondo i casi FileOutputStream l’output è un file, il cui nome è passato al costruttore di FileOutputStream in alternativa si può passare al costruttore un oggetto File costruito a parte, o anche un FileDescriptor

STREAM DI BYTE - OUTPUT Le altre classi derivate da OutputStream hanno come scopo avvolgere un altro OutputStream per creare un’entità con funzionalità più evolute. Il loro costruttore ha quindi come parametro un OutputStream

STREAM DI BYTE - OUTPUT Le due classi principali sono: ObjectOutputStream scrive oggetti serializzati salvati su stream offre metodi per scrivere i tipi primitivi e le classi standard (Integer, etc.) di Java FilterOutputStream definisce il concetto di “filtro” modifica il metodo write(), e se occorre anche altri, in modo da svolgere le scritture in accordo al criterio di filtraggio richiesto in pratica si usano le sue sottoclassi

STREAM DI BYTE - OUTPUT Le sottoclassi di FilterOutputStream: BufferedOutputStream modifica il metodo write() in modo da scrivere tramite un buffer (che aggiunge) DataOutputStream fornisce metodi per scrivere in forma bina-ria tipi di dati standard (writeInteger(),..) PrintStream definisce metodi per stampare sotto forma di stringa i tipi primitivi (print()) e le classi standard (mediante toString())

IL CASO DI System.out L’oggetto statico System.out, lo standard output, è appunto un OutputStream viene praticamente sempre “avvolto” (wrapped) in un tipo di OutputStream più evoluto per comodità Ad esempio: BufferedOutputStream output = new BufferedOutputStream(System.out);

System.in e System.out Attenzione: Lo standard input (System.in) e lo standard output (System.out) sono in effetti stream di caratteri Dovrebbero essere definiti come Reader e Writer, rispettivamente Invece, sono definiti come InputStream e OutputStream per motivi di compatibilità in Java 1.0 Reader e Writer non c’erano

System.in e System.out Quindi, bisogna fare attenzione: anche se definiti come InputStream e OutputStream per motivi di compatibilità, rimangono stream di caratteri Non ha senso scrivere su essi dati in forma binaria in output, si vedrebbero quadratini e faccine in input, si leggerebbero valori casuali Si possono “trasformare” in Reader e Writer con alcune classe apposite

ESEMPIO 1 Scrittura di dati su file binario Per scrivere su un file binario occorre un FileOutputStream, che però consente solo di scrivere un byte o un array di byte Volendo scrivere dei float, int, double, boolean, … è molto più pratico un DataOutputStream, che ha metodi idonei Quindi, si incapsula il FileOutputStream in un DataOutputStream

ESEMPIO 1 import java.io.*; public class Esempio1 { public static void main(String args[]){ FileOutputStream fs = null; try { fs = new FileOutputStream("Prova.dat"); } catch(IOException e){ System.out.println("Apertura fallita"); System.exit(1); // continua...

ESEMPIO 1 (segue) DataOutputStream os = new DataOutputStream(fs); float f1 = 3.1415F; char c1 = 'X'; boolean b1 = true; double d1 = 1.4142; try { os.writeFloat(f1); os.writeBoolean(b1); os.writeDouble(d1); os.writeChar(c1); os.writeInt(12); os.close(); } catch (IOException e){ System.out.println("Scrittura fallita"); System.exit(2); }

ESEMPIO 2 Rilettura di dati da file binario Per leggere da un file binario occorre un FileInputStream, che però consente solo di leggere un byte o un array di byte Volendo leggere dei float, int, double, boolean, … è molto più pratico un DataInputStream, che ha metodi idonei Quindi, si incapsula il FileInputStream in un DataInputStream

ESEMPIO 2 import java.io.*; public class Esempio2 { public static void main(String args[]){ FileInputStream fin = null; try { fin = new FileInputStream("Prova.dat"); } catch(FileNotFoundException e){ System.out.println("File non trovato"); System.exit(3); // continua...

ESEMPIO 2 (segue) DataInputStream is = new DataInputStream(fin); float f2; char c2; boolean b2; double d2; int i2; try { f2 = is.readFloat(); b2 = is.readBoolean(); d2 = is.readDouble(); c2 = is.readChar(); i2 = is.readInt(); is.close(); System.out.println(f2 + ", " + b2 + ", " + d2 + ", " + c2 + ", " + i2); } catch (IOException e){ System.out.println("Errore di input"); System.exit(4); }

IL PACKAGE java.io Stream di caratteri (Reader e Writer) Le classi per l’I/O da stream di caratteri sono più efficienti di quelle a byte convertono correttamente la codifica UNICODE di Java in quella locale specifica della piattaforma in uso (tipicamente ASCII) e della lingua in uso (essenziale per l’internazionalizzazione).

STREAM DI CARATTERI La classe base Reader definisce metodi per: leggere uno o più caratteri (read()) sapere se lo stream è pronto per l’input (ready()) saltare N byte in input (skip()) ricavare la posizione corrente sullo stream (mark()) e tornarci (reset()) , sempreché markSupported() sia vero.

STREAM DI CARATTERI La classe base Writer definisce metodi per: scrivere uno o più caratteri (write()) svuotare il buffer di uscita (flush()) chiudere lo stream (close())

STREAM DI CARATTERI Dalle classi base astratte si derivano molte classi concrete che specializzano l’I/O per: I/O da array di caratteri e da stringhe I/O bufferizzato I/O da stream di byte caso particolare: I/O da file I/O filtrato I/O da pipe Il metodo read() restituisce caratteri UNICODE.

STREAM DI CARATTERI

STREAM DI CARATTERI - INPUT Da Reader derivano in primis: CharArrayReader l’input è un array di caratteri, passato al costruttore di CharArrayReader StringReader l’input è una stringa di caratteri, passata al costruttore di StringReader BufferedReader l’input è un altro Reader (“wrapping”) aggiunge la capacità di lettura bufferizzata (in particolare, un metodo readLine())

STREAM DI CARATTERI - INPUT Un caso particolarissimo di Reader è l’InputStreamReader, che reinterpreta un InputStream come un Reader È il ponte fra il mondo dei generici stream di byte (Java 1.0) e il mondo degli stream di caratteri (Java 1.1) Consente di “vedere” qualunque stream di byte come uno stream di caratteri ovviamente, ha senso solo se da quello stream provengono realmente caratteri !

IL CASO DI System.in L’oggetto statico System.in, lo standard input, è formalmente un InputStream... ... ma in realtà è uno stream di caratteri! Può essere “trasformato virtualmente” in un Reader incapsulandolo con un InputStreamReader Tipicamente: InputStreamReader kbd = new InputStreamReader(System.in);

STREAM DI CARATTERI - INPUT Da InputStreamReader deriva poi FileReader in pratica, costruisce un FileInputStream e lo incapsula in un InputStreamReader velocizza questa operazione, consentendo di costruire direttamente un FileReader a partire dal nome del file (una stringa) in alternativa si può passare al costruttore un oggetto File costruito a parte, o anche un FileDescriptor

STREAM DI CARATTERI - OUTPUT Da Writer derivano in primis: CharArrayWriter l’output è un array di caratteri StringWriter l’input è una stringa di caratteri BufferedWriter l’input è un altro Writer (“wrapping”) aggiunge la capacità di scrittura bufferizzata

STREAM DI CARATTERI - OUTPUT Un caso particolarissimo di Writer è l’OutputStreamWriter, che reinterpreta un OutputStream come un Writer È il ponte fra il mondo dei generici stream di byte (Java 1.0) e il mondo degli stream di caratteri (Java 1.1) Consente di “vedere” qualunque stream di byte come uno stream di caratteri ovviamente, ha senso solo se quello stream accetta realmente caratteri !

IL CASO DI System.out L’oggetto statico System.out, lo standard output, è formalmente un OutputStream... ... ma in realtà è uno stream di caratteri! Può essere “trasformato virtualmente” in un Writer incapsulandolo con un OutputStreamWriter Tipicamente: OutputStreamWriter video = new OutputStreamWriter(System.out);

STREAM DI CARATTERI - OUTPUT Da OutputStreamWriter deriva poi FileWriter costruisce un FileOutputStream e lo incapsula in un OutputStreamWriter velocizza questa operazione, consentendo di costruire direttamente un FileWriter a partire dal nome del file (una stringa) in alternativa si può passare al costruttore un oggetto File costruito a parte, o anche un FileDescriptor

ESEMPIO 3 Scrittura di dati su file di testo Per scrivere su un file di testo occorre un FileWriter, che però consente solo di scrivere un carattere o una stringa Volendo scrivere dei float, int, double, boolean, … occorre convertirli in stringhe a priori con il metodo toString() della classe corrispondente, e poi stamparli Non esiste qualcosa di simile allo stream DataOutputStream

ESEMPIO 3 import java.io.*; public class Esempio3 { public static void main(String args[]){ FileWriter fout = null; try { fout = new FileWriter("Prova.txt"); } catch(IOException e){ System.out.println("Apertura fallita"); System.exit(1); float f1 = 3.1415F; char c1 = 'X'; boolean b1 = true; double d1 = 1.4142;

ESEMPIO 3 (segue) } try { String buffer = null; buffer = Float.toString(f1); fout.write(buffer,0,buffer.length()); buffer = new Boolean(b1).toString(); buffer = Double.toString(d1); fout.write(c1); // singolo carattere buffer = Integer.toString(12); fout.close(); } catch (IOException e){...} }

ESEMPIO 3 - note Il nostro esempio ha stampato sul file le rappresentazioni sotto forma di stringa di svariati valori... ... ma non ha inserito spazi intermedi ! Ha perciò scritto: 3.1415true1.4142X12

ESEMPIO 4 Rilettura di dati da file di testo Per leggere da un file di testo occorre un FileReader, che però consente solo di leggere un carattere o una stringa Occorre quindi un ciclo che legga carat-tere per carattere fino alla fine del file il metodo ready() restituisce true finché ci sono altri caratteri da leggere il metodo read() restituisce il carattere letto sotto forma di int, perché -1 indica l’EOF

ESEMPIO 4 import java.io.*; public class Esempio4 { public static void main(String args[]){ FileReader fin = null; try { fin = new FileReader("Prova.txt"); } catch(FileNotFoundException e){ System.out.println("File non trovato"); System.exit(3); // continua...

ESEMPIO 4 (segue) try { while(fin.ready()){ char ch = (char) fin.read(); System.out.print(ch); // echo } System.out.println(""); catch (IOException e){ System.out.println("Errore di input"); System.exit(4);

ESEMPIO 3 - UNA VARIANTE La versione precedente ha stampato sul file le rappresentazioni sotto forma di stringa di svariati valori, ma non ha inserito spazi intermedi Aggiungiamo uno spazio fra i valori, in modo da stampare non più 3.1415true1.4142X12 ma 3.1415 true 1.4142 X 12

ESEMPIO 3 - VARIANTE try { String buffer = null; buffer = Float.toString(f1) + " "; fout.write(buffer,0,buffer.length()); buffer = new Boolean(b1).toString() + " "; buffer = Double.toString(d1) + " "; fout.write(c1); // singolo carattere fout.write(' '); buffer = Integer.toString(12) + " "; fout.close(); } ...

ESEMPIO 4 - UNA VARIANTE La versione precedente ha letto dal file un’unica stringa ininterrotta non poteva far altro, mancando gli spazi Ora però gli spazi fra i valori ci sono: ergo, possiamo definire una funzione statica readField() che legga un campo fino al successivo spazio non può essere un metodo, perché esso dovrebbe far parte della classe FileReader, che non possiamo modificare

ESEMPIO 4 - readField() static public String readField(Reader in){ StringBuffer buf = new StringBuffer(); boolean nospace = true; try { while(in.ready() && nospace){ char ch = (char)in.read(); nospace = (ch!=' '); if (nospace) buf.append(ch); } } catch (IOException e){ System.out.println("Errore di input"); System.exit(4); return buf.toString();

L’ESEMPIO 4 RIFORMULATO // continua... try { while(fin.ready()){ String s = readField(fin); System.out.println(s); // echo } catch (IOException e){ System.out.println("Errore di input"); System.exit(4);

L’ESEMPIO 4 RIFORMULATO In questo modo, siamo in grado di leggere una stringa alla volta Ogni stringa può quindi essere interpre-tata nel modo che le è proprio... ...applicando, se occorre, la conversione opportuna nessuna conversione per le stringhe conversione stringa / int per gli interi conversione stringa / float per i reali ...

StreamTokenizer La classe StreamTokenizer consente di leggere da input una serie di “token” Può estrarre da uno stream (reader) sia numeri sia stringhe, in modo configurabile whitespaceChars(int lo, int hi) registra come separatori i caratteri da lo a hi nextToken() estrae il token successivo, che viene posto nel campo pubblico sval (se è una stringa) o nval (se è un numero) il valore restituito nextToken() da indica se si tratta di un numero o di una stringa

t = new StreamTokenizer(reader); t.whitespaceChars('\0' , ' '); ESEMPIO 5 Leggere da input una serie di token Avvolgiamo il reader che fornisce l’input con uno StreamTokenizer t = new StreamTokenizer(reader); Configuriamo lo StreamTokenizer per assumere come separatori (“spazi”) tutti i caratteri fra lo '\0' e lo spazio ' ' t.whitespaceChars('\0' , ' ');

ESEMPIO 5 Poi: Predisponiamo un ciclo che ripeta res = t.nextToken(); e guardiamo cosa abbiamo letto:

ESEMPIO 5 import java.io.*; public class Esempio5 { public static void main(String args[]){ FileReader f = null; // ... apertura del file... StreamTokenizer t = new StreamTokenizer(f); t.whitespaceChars(0, (int)' '); int res = -1; do { try { res = t.nextToken(); } catch (IOException e) { ... } // ... continua ...

ESEMPIO 5 // ... continua ... if (res == StreamTokenizer.TT_WORD) { String s = new String(t.sval); System.out.println("stringa: " + s); } else if (res == StreamTokenizer.TT_NUMBER) { double d = t.nval; System.out.println("double: " + d); } } while( res != StreamTokenizer.TT_EOL && res != StreamTokenizer.TT_EOF);

SERIALIZZAZIONE DI OGGETTI Serializzare un oggetto significa salvare un oggetto scrivendo una sua rappresen-tazione binaria su uno stream di byte Analogamente, deserializzare un oggetto significa ricostruire un oggetto a partire dalla sua rappresentazione binaria letta da uno stream di byte Le classi ObjectOutputStream e Object-InputStream offrono questa funzionalità per qualunque tipo di oggetto.

SERIALIZZAZIONE DI OGGETTI Le due classi principali sono: ObjectInputStream legge oggetti serializzati salvati su stream, tramite il metodo readObject() offre anche metodi per leggere i tipi primitivi di Java ObjectOutputStream scrive un oggetto serializzato su stream, tramite il metodo writeObject() offre anche metodi per scrivere i tipi primitivi di Java

SERIALIZZAZIONE DI OGGETTI Una classe che voglia essere “serializ-zabile” deve implementare l’interfaccia Serializable È una interfaccia vuota, che serve come marcatore (il compilatore rifiuta di compi-lare una classe che usi la serializzazione senza implementare tale interfaccia) Vengono scritti / letti tutti i dati dell’og-getto, inclusi quelli ereditati (anche se privati o protetti)

SERIALIZZAZIONE DI OGGETTI Se un oggetto contiene riferimenti ad altri oggetti, si invoca ricorsivamente writeObject() su ognuno di essi si serializza quindi, in generale, un intero grafo di oggetti l'opposto accade quando si deserializza Se uno stesso oggetto è referenziato più volte nel grafo, viene serializzato una sola volta, affinché writeObject() non cada in una ricorsione infinita.

ESEMPIO 6 Una piccola classe serializzabile... public class Punto2D implements java.io.Serializable { float x, y; public Punto2D(float x, float y) { this.x = x; this.y = y; } public Punto2D() { x = y = 0; } public float ascissa(){ return x; } public float ordinata(){ return y;} }

ESEMPIO 6 ...e un main che ne fa uso public class Esempio6 { public static void main(String[] args) { FileOutputStream f = null; try { f = new FileOutputStream("xy.bin"); } catch(IOException e){ System.exit(1); } // ... continua...

ESEMPIO 6 // ... continua ... ObjectOutputStream os = null; Punto2D p = new Punto2D(3.2F, 1.5F); try { os = new ObjectOutputStream(f); os.writeObject(p); os.flush(); os.close(); } catch (IOException e){ System.exit(2); }

ESEMPIO 7 Rilettura da stream di oggetti serializzati public class Esempio7 { public static void main(String[] args) { FileInputStream f = null; ObjectInputStream is = null; try { f = new FileInputStream("xy.bin"); is = new ObjectInputStream(f); } catch(IOException e){ System.exit(1); } // ... continua...

ESEMPIO 7 // ... continua ... Punto2D p = null; Il cast è necessario, perché readObject() restituisce un Object // ... continua ... Punto2D p = null; try { p = (Punto2D) is.readObject(); is.close(); } catch (IOException e1){ System.exit(2); } catch (ClassNotFoundException e2){ System.exit(3); } System.out.println("x,y = " + p.ascissa() + ", " + p.ordinata()); }