Java I/O e serializzazione

Documenti analoghi
Java I/O e serializzazione

domenica 9 giugno 13 Serializzazione

I/O Streams in Java. Lorenzo Gallucci

Lettura e scrittura - Stream

Corso sul linguaggio Java

Il linguaggio Java. Gli stream

INPUT OUTPUT

Informatica. Prof. A. Longheu. Input e Output

JAVA - I/O System. Il JAVA considera tutte i flussi da e verso l esterno, come stream di byte. Questi possono essere di ingresso o di uscita:

LETTURA DI DATI DA INPUT

Java I/O API. Java I/O. G. Grossi. 10 gennaio G. Grossi Lezione 11

Indice. 1 Java I/O API. Indice

La paninoteca. Mi resta da scrivere solo costo()

02CBI - M. Morisio. I/O in Java. Input Output. Classi di Primo Livello - java.io. Stream. Pag. 1

A. Ferrari Java: Stream e File

INPUT OUTPUT Programmazione in rete e laboratorio. Le operazioni di I/O avvengono attraverso stream (sequenze di byte)

Programmazione ad Oggetti

Le classi FileInputStream e RandomAccessFile. Semplici Algoritmi di Ordinamento

Lettura e scrittura - Stream

PROVA FINALE Ingegneria del software

Il package java.io fornisce le classi necessarie per effettuare input e output su file/rete/console/aree di memoria RAM eccetera.

A. Ferrari Stream e File

Input/Output. Introduzione. Stream. Capitolo 10 LORENZO BETTINI

La Serializzazione in Java. L24_Serialization 1

Fondamenti di Informatica C Esercitazioni di Laboratorio / 4 Outline

Il linguaggio Java I file sequenziali

14 Input-Output. Outline. Goal della lezione. Argomenti. Mirko Viroli a.a. 2013/2014

20 - Input/Output su File

15 Input-Output. Mirko Viroli C.D.L. Ingegneria e Scienze Informatiche Alma Mater Studiorum Università di Bologna, Cesena

argomen> PACKAGE DI I/O Gli STREAM: conce0 di base STREAM di byte STREAM di cara8eri Ges9one di File (classe File) Serializzazione 02/11/14

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

LETTURA DI DATI DA INPUT. Gli stream di byte consentono già di leggere dati (numeri di vario tipo), tramite la classe DataInputStream

Informatica I. Ingegneria Medica. Prof. Diego Salamon

Laboratorio Reti di Calcolatori Laurea Triennale in Comunicazione Digitale. Anno Accademico 2012/2013

IL PACKAGE java.io CONCETTO BASE: LO STREAM

Introduzione. Java. Streams. Streams

Serializzazione Java. Serializzazione. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

IL PACKAGE java.io. Il package java.io definisce i concetti base per gestire l'i/o da qualsiasi sorgente e verso qualsiasi destinazione.

File e Stream In Java. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132

Serializzazione Java. Serializzazione. Complicazioni 1/2. Complicazioni 2/2. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

Unità 2 I file binari

Gestione di file in Java

789:;<:' .&+/"0&12%34%5&66+,("%3787%% %"+&%88$77%9%8:$:7%% ;<'&12%8%=,+>"%3787 % % % %"+&%88$77%9%8:$:7%

Programmazione 2. Input Output su Stream e File

Input/Output in Java

Java I/O. Corso di Programmazione CdS: Informatica e Tecnologie per la Produzione di Software Nicola Fanizzi.

Il package java.io definisce i concetti base per gestire l'i/o da qualsiasi sorgente e verso qualsiasi destinazione. CONCETTO BASE: LO STREAM

RETI DI CALCOLATORI Linguaggio Java: Il Package di Input Output

Serializzazione. Programmazione in Ambienti Distribuiti A.A

Lezione n.5 LPR-Informatica Applicata 13/3/2006

Java. Il package java.io

Programmazione distribuita in Java. da materiale di Carlo Ghezzi e Alfredo Motta

Lezione 16 programmazione in Java

ESERCIZIO 1 (FILE DI TESTO)

FileInputStream read() read(byte[]) readint() DataInputStream FileInputStream EOFException

Il sistema I/O di Java

Java: la libreria delle classi

Persistenza e Serializzazione

Esercitazioni di FONDAMENTI DI INFORMATICA MODULO B

Riassunto. Rassegna API - 2: eccezioni e file. Eccezioni. Oggi. Gettare. Gettare, catturare, rimbalzare. Stefano Mizzaro 1

Flussi, lettori e scrittori

Un flusso (stream) è una astrazione che produce e/o consuma informazioni.

Programmazione Orientata agli Oggetti in Linguaggio Java

Variabili e Metodi di classe Interfacce e Package File in Java

Riassunto. Rassegna API - 2: eccezioni e file. Eccezioni. Oggi. Gettare, catturare, rimbalzare. Gettare. Stefano Mizzaro 1

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

LPR A 2005/2006 Lezione 4

Comunicare'con'il'mondo

PROVA FINALE Ingegneria del software

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

I tipi di dato primitivi

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Appunti dei corsi di

Il linguaggio assembly

Impariamo a programmare in. Lezione 5

Lezione n.5 LPR-A UDP: COSTRUZIONE DI PACCHETTI

Lezione 18 Le classi per l'input/output nel pacchetto java.io

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

TIPI PRIMITIVI E CLASSI WRAPPER

Laboratorio di reti I: Java IO

PACKAGE DI I/O. Dott. Riccardo Zese.

Corso sul linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Prof. D. Malerba Dr. A. Appice - Dr. M.Ceci. Il sistema Input/Output di Java

Fondamenti di Informatica T2 Modulo 2. Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009. Files? Yes, Thanks!

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Files? Yes, Thanks! Serializzazione di entità semplice. Meccanismi. Meccanismi. Meccanismi. Fondamenti di Informatica T2 Modulo 2

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

File, flussi e pacchetto java.io

10. File e loro attributi

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Corso sul linguaggio Java

Sockets in Java. Lorenzo Gallucci

Serialization. Persistenza dei dati quando l applicazione non è running: salvataggio della struttura interna di un oggetto. E un problema ricorsivo!

ProgrammazioneJava. Davide Di Ruscio Dipartimento di Informatica Università degli Studi dell Aquila.

Lezione n.7. UDP: Costruzione di pacchetti, e esercizi avanzati 10/11/2009 Andrea Corradini

Transcript:

Java I/O e serializzazione

Caratteristiche dell I/O in Java Diverse classi per gestire I/O differenti sotto un unica struttura. Possibilità di combinare classi differenti. Modalità di interazione distinte in termini di byte o caratteri.

Classe InputStream Viene ereditata da tutte le classi che rappresentano uno stream in lettura. Fornisce i seguenti metodi: 1 int available(); //Optional 2 void close(); 3 int read(); 4 int read(byte[] b); 5 int read(byte[] b, int off, int len); 6 long skip(long n);

Classe OutputStream Viene ereditata da tutte le classi che rappresentano uno stream in scrittura. Fornisce i seguenti metodi: 1 void close(); 2 void flush(); 3 void write(int b); 4 void write(byte[] b); 5 void write(byte[] b, int off, int len);

Classi FileInputStream e FileOutputStream Implementano lettura e scrittura di file. Costruttori: 1 FileInputStream(File file); 2 FileInputStream(String name); 3 4 FileOutputStream(File file) 5 FileOutputStream(File file, boolean append); 6 FileOutputStream(String name); 7 FileOutputStream(String name, boolean append);

Classe ByteArrayInputStream Tratta un array di byte come un input. Costruttori: 1 ByteArrayInputStream(byte[] buf); //Creates a ByteArrayInputStream so that it uses buf as its buffer array. 2 ByteArrayInputStream(byte[] buf, int offset, int length); //Creates ByteArrayInputStream that uses buf as its buffer array.

Classe ByteArrayOutputStream Tratta un array di byte come un output. È possibile ottenere l array di byte contenente l output tramite: 1 byte[] tobytearray(); //Crea un array contentente l output scritto nello stream.

BufferedInputStream e BufferedOutputStream Queste classi aggiungono un buffer ad un InputStream/OutputStream dato. Inoltre BufferedInputStream aggiunge le funzionalità di mark e reset allo stream.

Classe DataInputStream Aggiunge funzionalità ad un input stream. Attenzione: i metodi operano in binario! Fornisce i seguenti metodi: 1 DataInputStream(InputStream in); 2 3 boolean readboolean(); 4 byte readbyte(); 5 char readchar(); 6 double readdouble(); 7 float readfloat(); 8 int readint(); 9 long readlong(); 10 short readshort(); 11 int readunsignedbyte(); 12 int readunsignedshort(); 13 String readutf(); 14 static String readutf(datainput in);

Classe DataOutputStream Aggiunge funzionalità ad un output stream. Attenzione: i metodi operano in binario! Fornisce i seguenti metodi: 1 DataOutputStream(OutputStream out); 2 3 void writeboolean(boolean v); 4 void writebyte(int v); 5 void writebytes(string s); 6 void writechar(int v); 7 void writechars(string s); 8 void writedouble(double v); 9 void writefloat(float v); 10 void writeint(int v); 11 void writelong(long v); 12 void writeshort(int v); 13 void writeutf(string str);

Reader e Writer Finora abbiamo operato direttamente su sequenze di byte. È possibile ragionare in termini di caratteri tramite le classi Reader e Writer. Tali classi rappresentano un input stream in termini di caratteri.

Classe Reader Viene ereditata da tutte le classi che rappresentano uno stream di caratteri in lettura. Fornisce i seguenti metodi: 1 void close(); //Closes the stream and releases any system resources associated with it. 2 int read(); //Reads a single character. 3 int read(char[] cbuf); //Reads characters into an array. 4 int read(char[] cbuf, int off, int len); //Reads characters into a portion of an array. 5 int read(charbuffer target); //Attempts to read characters into the specified character buffer. 6 boolean ready(); //Tells whether this stream is ready to be read. 7 void reset(); //Resets the stream. 8 long skip(long n); //Skips characters.

Classe Writer Viene ereditata da tutte le classi che rappresentano uno stream di caratteri in scrittura. Fornisce i seguenti metodi: 1 void close(); //Closes the stream, flushing it first. 2 void flush(); //Flushes the stream. 3 void write(char[] cbuf); //Writes an array of characters. 4 void write(char[] cbuf, int off, int len); //Writes a portion of an array of characters. 5 void write(int c); //Writes a single character. 6 void write(string str); //Writes a string. 7 void write(string str, int off, int len); //Writes a portion of a string.

Come passare da I/O su byte a I/O su caratteri? Le classi OutputStreamWriter e InputStreamReader fanno da ponte tra le due. Queste costruiscono un Reader/Writer partendo da un InputStrem/OutputStream. È possibile fornire la codifica da utilizzare, altrimenti verrà usata quella di default.

Classe Scanner Questa classe fornisce metodi utili per parsare un input. Fornisce i seguenti metodi: 1 String findinline(string pattern); 2 String findwithinhorizon(string pattern, int horizon); 3 boolean hasnext(); 4 String next(); 5 String next(string pattern); 6 boolean nextboolean(); 7 byte nextbyte(); 8 double nextdouble(); 9 float nextfloat(); 10 int nextint(); 11 String nextline(); 12 Scanner skip(string pattern); 13 Scanner usedelimiter(string pattern);

Classe PrintWriter Questa classe fornisce metodi utili per stampare un output testuale. Fornisce i seguenti metodi: 1 void print(boolean b); 2 void print(char c); 3 void print(char[] s); 4 void print(double d); 5 void print(float f); 6 void print(int i); 7 void print(long l); 8 void print(object obj); 9 void print(string s); 10 PrintWriter printf(locale l, String format, Object... args); 11 void println(); 12 void println(...); //Stessi metodi di print

Esercizio CSV Si implementi un lettore di file comma-separated values (CSV) Per semplicità si ipotizzi che i caratteri virgola e a capo non siano presenti all interno di alcun valore Fornisce i seguenti metodi: 1 public interface CSVReader { 2 3 public Map<String, String> getrow(int index);//ritorna una riga ( mappa tra i nomi del campo nell intestazione e il valore della riga) 4 5 public int size(); //Ritorna il numero di righe presenti 6 7 }

Esercizio magic number Si vuole identificare se un determinato file è un eseguibile ELF o meno Per semplicità si consideri solo il magic number presente all inizio

Serializzazione Permette di memorizzare, trasmettere via rete una struttura dati

Cosa può essere serializzato? Tipi primitivi, stringhe e istanze di classi serializzabili Riferimenti e classi che rappresentano risorse di sistema (Socket, File,... ) NON possono essere serializzate.

Riferimenti La serializzazione genera una rappresentazione dei dati copiando il contenuto degli oggetti, non i loro riferimenti! Con la deserializzazione otteniamo dei nuovi oggetti, diversi da quelli originali ma con lo stesso valore

Esempio di classe serializzabile 1 public class Person implements Serializable{ 2 3 private static final long serialversionuid = 382104422531955291L; 4 5 private final String name; 6 7 private final Calendar birthday; 8 9 } Implementa Serializable Contiene solo tipi primitivi/oggetti serializzabili

serialversionuid Identifica la versione della classe serializzata Serve per controllare la compatibilità tra diverse versioni della stessa classe che potrebbero avere attributi diversi

Serializzazione Si effettua tramite il metodo writeobject della classe ObjectOutputStream Questo metodo serializza l oggetto passato come parametro e lo scrive su uno stream di uscita

Esempio di serializzazione 1 public static void main(string[] args) throws IOException, ClassNotFoundException { 2 Person person = new Person("Mario", new GregorianCalendar(1990, 11, 20)); 3 ByteArrayOutputStream os = new ByteArrayOutputStream(); 4 ObjectOutputStream out = new ObjectOutputStream(os); 5 out.writeobject(person); //Serializzo 6 }

Deserializzazione Si effettua tramite il metodo readobject della classe ObjectInputStream Questo metodo deserializza il primo oggetto presente nello stream di ingresso Attenzione: Oltre agli errori dovuti alla lettura dallo stream è possibile ottenere una ClassNotFoundException se la classe dell oggetto da deserializzare non viene trovata nel classpath.

Esempio completo di serializzazione 1 public static void main(string[] args) throws IOException, ClassNotFoundException { 2 Person person = new Person("Mario", new GregorianCalendar(1990, 11, 20)); 3 ByteArrayOutputStream os = new ByteArrayOutputStream(); 4 ObjectOutputStream out = new ObjectOutputStream(os); 5 out.writeobject(person); //Serializzo 6 7 ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); 8 ObjectInputStream in = new ObjectInputStream(is); 9 Person p = (Person)in.readObject(); //Deserializzo 10 }

Attributi transient È possibile specificare come transient attributi che non è possibile (o utile) serializzare Tali attributi vengono ignorati dalla serializzazione La deserializzazione (di default) non inizializza gli attributi transient, che assumono il valore null È però possibile modificare il metodo di deserializzazione ridefinendo readobject (analogamente posso ridefinire writeobject)

Esempio di attributi transient 1 public class Person implements Serializable{ 2 private static final long serialversionuid = 382104422531955291L; 3 private final String name; 4 private final Calendar birthday; 5 private transient int age; 6 7 // Posso ridefinire come viene serializzato l oggetto sullo stream 8 private void writeobject(objectoutputstream out) throws IOException { 9 out.defaultwriteobject(); //Utilizzo il comportamento di default 10 } 11 12 // Posso ridefinire come viene deserializzato l oggetto dallo stream 13 private void readobject(objectinputstream in) throws ClassNotFoundException, IOException{ 14 in.defaultreadobject(); //Utilizzo il comportamento di default 15 //Qui posso inizializzare eventuali attributi transient 16 age = computeage(); 17 } 18 }