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

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

Input/Output in Java

RETI DI CALCOLATORI Linguaggio Java: Il Package di Input Output

Il linguaggio Java I file sequenziali

Flussi, lettori e scrittori

20 - Input/Output su File

Unità 2 I file binari

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

Introduzione. Java. Streams. Streams

Creazione, eliminazione, lettura e scrittura di file di testo

Lettura e scrittura - Stream

JAVA INTRODUZIONE C++ JDK e JRE API IDE (BLUEJ) JAVA Introduzione. Versioni e IDE DIAPOSITIVA 2 ALESSANDRO URSOMANDO

Corso sul linguaggio Java

Architettura Client-Server

Il sistema I/O di Java

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

10.4. La classe File e gli attributi di directory e file

File, flussi e pacchetto java.io

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

Esercitazioni Ingegneria del So2ware 3 - Programmazione Java Excep<ons, I/O

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

Java e Serializzazione dalla A all'xml di Leonardo Puleggi

Programmazione 2. Input Output su Stream e File

LabVIEW parte II. Ing. Gianfranco Miele November 3, 2010

Input e Output in Java

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Corso di Reti di Calcolatori L-A

C. Horstmann Fondamenti di programmazione e Java 2 3^ edizione Apogeo

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

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Operazioni di scrittura e lettura con periferici in linguaggio Java

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

La gestione di file e flussi in Java: note introduttive

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

Uso di metodi statici. Walter Didimo

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

FILE BINARI FILE BINARI

Laboratorio di reti I: Java IO

Corso Android New Edition Corso Online Programmatore Android New Edition

Sviluppo Applicazioni Mobile Lezione 13. Dr. Paolo Casoto, Ph.D

Gestione delle Eccezioni

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Cifratura simmetrica

Definizione di metodi

Java RMI (Remote Method Invocation)

Restrizioni per la sicurezza

Gestione di files Motivazioni

Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

Scritto da Enrico Battuello Giovedì 25 Novembre :11 - Ultimo aggiornamento Venerdì 07 Gennaio :50

R. Focardi 2002 Laboratorio di Ingegneria del Software Slide 1. Applicazioni = programmi stand-alone

Capitolo 13 Java IO. Software per TLC - AA 2008/2009 1

Uno stream o flusso di dati o canale è un percorso di comunicazione tra la sorgente di una certa informazione e la sua destinazione.

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Laboratorio di Elementi di Bioinformatica

Corso di Reti di Calcolatori. java.net.url

Le variabili. Olga Scotti

Laboratorio di Informatica Lezione 4

Libreria standard JAVA

4 GLI ARRAY E LE STRINGHE

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Esercizio 1: archivio CD e DVD

MagiCum S.r.l. Progetto Inno-School

Eccezioni 1 CASO: SENTIRE E GESTIRE UN ALLARME. Prof. Enrico Denti Università di Bologna A.A. 2012/ SITUAZIONI CRITICHE IL CONCETTO DI ECCEZIONE

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Gestione dei file. Linguaggio ANSI C Input/Output - 13

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

RMI. Java RMI RMI. G. Prencipe

Input / Output attraverso stream. I/O in C vs. I/O in C++

JAVA E LA RETE IL CONCETTO DI SOCKET. RETI DI CALCOLATORI Linguaggio Java: La Programmazione di Rete. già pronta!! COMUNICAZIONE VIA SOCKET CORSO DI

Gestione delle eccezioni in Java

Lezione 11 Accesso al file system

C# I FILES. Ad esempio, se volessimo memorizzare le seguenti informazioni relative ad una persona: Nome Telefono Indirizzo

Lettura e scrittura di file di dati input/output

Modificatori. Controllo di visibilità

Introduzione al C. Stream e disk file

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRGDWDJUDP

Introduzione al Linguaggio C

Programmazione Orientata agli Oggetti in Linguaggio Java

LPR A 2005/2006 Lezione 4

20/12/2010. Package java.net (Socket ServerSocket) Package java.rmi (uso di oggetti remoti)

Architettura degli elaboratori Docente:

Oggetti e classi. Cos è un oggetto

Lezione n.2b. Threads: Callable & Future. 6/10/2008 Vincenzo Gervasi

Remote Method Invocation (RMI)

OOP: L13: Eccezioni e loro trattamento in Java

Java Native Interface Appunti

Programmazione Java: Variabili membro, Metodi La parola chiave final

Corso di Laurea in Informatica e Comunicazione Digitale. a.a Interazione Uomo-Macchina. Introduzione a Java.

Esonero del corso di Programmazione a Oggetti

Corso Online. We Train Italy

Programmazione Java (Applicazioni e Applet )

Mirko Mariotti. March 9, 2009

Connessioni di rete. Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi. PdR_ Stefano Millozzi

Finestra.java. static String nomicolonne[] = {"ind.","cognome","nome","telefono"," "}; //nomi delle colonne della tabella

Il calcolatore. Architettura di un calcolatore (Hardware)

3. La sintassi di Java

Transcript:

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

conce@o base: gli stream I programmi in JAVA comunicano (cioè effe8uano operazioni di I/O) tramite gli STREAM. Uno STREAM è un astrazione di alto livello che produce o consuma informazioni: rappresenta una connessione ad un canale di comunicazione. Gli stream possono sia leggere da un canale di comunicazione che scrivere su tale canale: quindi si parla di stream di input e stream di output. conce@o base: gli stream Uno STREAM rappresenta quindi un estremità di un canale di comunicazione a un senso solo. Le classi di STREAM forniscono metodi per leggere da un canale o per scrivere su un canale. Quindi un output stream scrive dei da9 su un canale di comunicazione, mentre un input stream legge da9 da un canale di comunicazione. ATTENZIONE! Non esistono delle classi di stream che forniscano funzioni sia per leggere che per scrivere su un canale. Se si desidera sia leggere che scrivere su uno stesso canale di comunicazione si dovranno aprire due stream (uno di input e uno di output) collega9 allo stesso canale. 2

conce@o base: gli stream Gli STREAM si comportano in modo omogeneo, indipendentemente dal disposi9vo fisico con cui sono collega9 (da qui il conce@o di astrazione ad alto livello). Le stesse classi e gli stessi metodi di I/O posso essere applica9 a qualunque disposi9vo. Uno STREAM di input può essere u9lizzato per leggere da un file su disco, da tas9era o dalla rete; allo stesso modo uno STREAM di output può fare riferimento alla console (a video), a un file, o ancora ad una connessione di rete. L'approccio "a cipolla" conce@o base: l approccio alcuni >pi di stream rappresentano sorgen> di da> o disposi>vi di uscita [stream sorgente] file, connessioni di rete, array di byte,... stream sorgente stream incapsulante gli altri >pi di stream sono pensa> per "avvolgere" i preceden/ per aggiungere ulteriori funzionalità [stream incapsulante] 3

conce@o base: l approccio Così, è possibile configurare il canale di comunicazione con tu.e e sole le funzionalità che servono senza doverle replicare e reimplementare più volte. Massima flessibilità, minimo sforzo. stream sorgente stream destinazione stream incapsulante stream incapsulante stream di byte input da file FileInputStream è la classe derivata da InputStream che rappresenta il conce@o di sorgente di byte agganciata a un file Il nome del file da aprire è passato come parametro al costru8ore di FileInputStream In alterna9va si può passare al costru8ore un ogge@o File (o un FileDescriptor) costruito in precedenza FileInputStream file su disco 4

stream di byte input da file Per aprire un file binario in le@ura si crea un ogge8o di classe FileInputStream, specificando il nome del file all'a8o della creazione Per leggere dal file si usa poi il metodo read() che perme8e di leggere uno o più byte res>tuisce il byte le@o come intero fra 0 e 255 se lo stream è finito, res>tuisce - 1 se non ci sono byte, ma lo stream non è finito, rimane in a8esa dell'arrivo di un byte Poiché è possibile che le operazioni su stream falliscano per varie cause, tu8e le operazioni possono sollevare eccezioni. Necessità di u9lizzare blocchi try / catch input da file binario esempio import java.io.*; public class EsLeggiFile1 { public EsLeggiFile1(String filename) throws FileNotFoundException, IOException { FileInputStream is = new FileInputStream(filename); int x = is.read(); int n = 0; while (x >= 0) { System.out.print(" " + x); quando lo stream termina, read() restituisce -1 n++; x = is.read(); System.out.println("\nTotale byte: " + n); is.close();... 5

input da file binario esempio public static void main(string[] args) { try { EsLeggiFile1 oggetto = new EsLeggiFile1(args[0]); catch (FileNotFoundException ex) { System.out.println("File non trovato"); System.exit(1); catch(ioexception ex) { System.out.println("Errore di input"); System.exit(2); input da file binario esempio 6

stream di byte output su file FileOutputStream è la classe derivata da OutputStream che rappresenta il conce@o di disposi>vo di uscita agganciato a un file Il nome del file da aprire è passato come parametro al costru8ore di FileOutputStream In alterna9va si può passare al costru8ore un ogge@o File (o un FileDescriptor) costruito in precedenza FileOutputStream file su disco stream di byte output su file Per aprire un file binario in scri@ura si crea un ogge8o di classe FileOutputStream, specificando il nome del file all'a8o della creazione Un secondo parametro opzionale, di 9po boolean, perme8e di chiedere l'apertura in modo append Per scrivere sul file si usa il metodo write() che perme8e di scrivere uno o più byte scrive l'intero [0, 255] passatogli come parametro non res>tuisce nulla Poiché è possibile che le operazioni su stream falliscano per varie cause, tu8e le operazioni possono sollevare eccezioni. Necessità di u9lizzare blocchi try / catch 7

output su file binario - esempio import java.io.*; public class EsScriviFile1 { public EsScriviFile1(String filename) throws FileNotFoundException, IOException { FileOutputStream os = new FileOutputStream(filename);... for(int x=0; x<10; x+=3) { System.out.println("Scrittura di "+x); os.write(x); os.close(); Per aprirlo in modalità append: FileOutputStream(filename,true); output su file binario - esempio public static void main(string[] args) { try { EsScriviFile1 oggetto = new EsScriviFile1(args[0]); catch(filenotfoundexception e) { System.out.println("Impossibile aprire file"); System.exit(1); catch(ioexception ex) { System.out.println("Errore di output"); System.exit(2); 8

output su file binario - esempio Esperimenti Provare a rileggere il file con il programma precedente Aggiungere altri byte riaprendo il file in modo append stream di incapsulamento Gli STREAM di incapsulamento hanno come scopo quello di avvolgere un altro STREAM per creare un en9tà con funzionalità più evolute. InputStream Il loro costru8ore ha quindi come parametro un InputStream o un OutputStream già esistente. stream incapsulante OutputStream stream incapsulante 9

stream di incapsulamento - INPUT BufferedInputStream aggiunge un buffer e ridefinisce read() in modo da avere una le8ura bufferizzata DataInputStream definisce metodi per leggere i 9pi di da9 standard in forma binaria: readint(), readfloat(),... ObjectInputStream definisce un metodo per leggere ogge0 "serializza>" (salva9) da uno stream, offre anche metodi per leggere i 9pi primi9vi di Java stream di incapsulamento - OUTPUT BufferedOutputStream aggiunge un buffer e ridefinisce write() in modo da avere una scri8ura bufferizzata DataOutputStream definisce metodi per scrivere i 9pi di da9 standard in forma binaria: writeint(), writefloat()... PrintStream definisce metodi per stampare come stringa valori primi9vi ( es. (( print(object print(int)) e classi standard (es. ObjectOutputStream definisce un metodo per scrivere ogge0 serializza> ; offre anche metodi per scrivere i 9pi primi9vi di Java 10

esempio - OUTPUT Scri@ura di da> 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ù pra>co un DataOutputStream, che ha metodi idonei Si incapsula FileOutputStream dentro un DataOutputStream FileOutputStream DataOutputStream esempio - OUTPUT import java.io.*; public class EsScriviFile2 { public EsScriviFile2(String filename) throws FileNotFoundException, IOException { FileOutputStream fos=new FileOutputStream(filename); DataOutputStream dos=new DataOutputStream(fos); float f = 3.1415F; char c = 'X'; boolean b = true; double d = 1.4142; int i = 12; dos.writefloat(f); dos.writechar(c); dos.writeboolean(b); dos.writedouble(d); dos.writeint(i); dos.close();... 11

esempio - OUTPUT public static void main(string[] args) { try { EsScriviFile2 oggetto = new EsScriviFile2(args[0]); catch(filenotfoundexception e) { System.out.println("Impossibile aprire file"); System.exit(1); catch(ioexception ex) { System.out.println("Errore di output"); System.exit(2); Le8ura di da9 da file binario esempio - INPUT 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ù pra>co un DataInputStream, che ha metodi idonei Si incapsula FileInputStream dentro un DataInputStream FileInputStream DataInputStream 12

esempio - INPUT import java.io.*; public class EsLeggiFile2 { public EsLeggiFile2(String filename) throws FileNotFoundException, IOException {... FileInputStream fis = new FileInputStream(filename); DataInputStream dis = new DataInputStream(fis); float f = dis.readfloat(); char c = dis.readchar(); boolean b = dis.readboolean(); double d = dis.readdouble(); int i = dis.readint(); System.out.println("Ho letto:"+f+" "+c+" "+b+" "+d+" "+i); dis.close(); esempio - INPUT public static void main(string[] args) { try { EsLeggiFile2 oggetto = new EsLeggiFile2(args[0]); catch(filenotfoundexception e) { System.out.println("Impossibile aprire file"); System.exit(1); catch(ioexception ex) { System.out.println("Errore di output"); System.exit(2); 13

esempio input/output - risultato stream di cara@eri Le classi per l I/O da stream di cara8eri (Reader e Writer) sono più efficien8 di quelle a byte. Hanno nomi analoghi e stru8ura analoga Convertono corre8amente la codifica UNICODE di Java in quella locale specifica della pia8aforma in uso (9picamente ASCII)......e della lingua in uso (essenziale per l internazionalizzazione). 14

stream di cara@eri Cosa cambia rispe@o agli stream binari? Un file di testo si apre costruendo un ogge8o FileReader o FileWriter, rispe0vamente read() e write() leggono/scrivono un int che rappresenta un cara8ere UNICODE Un cara@ere UNICODE è lungo 2 byte. read() res9tuisce un valore tra 0 e 65535 oppure - 1 in caso di fine stream Occorre dunque un cast esplicito per conver9re il cara8ere UNICODE in int e viceversa. input da file di testo - esempio import java.io.*; public class EsLeggiFileTesto { public EsLeggiFileTesto(String filename) throws IOException { FileReader fr = new FileReader(filename); int n = 0; int x = fr.read(); while (x >= 0) { Cast esplicito da int a char char ch = (char) x; - Ma solo se è stato davvero System.out.print(ch); letto un carattere (cioè se n++; ( 1 - non è stato letto x = fr.read(); System.out.println("\nTotale caratteri: " + n); fr.close();... 15

input da file di testo - esempio public static void main(string[] args) { try { EsLeggiFileTesto oggetto = new EsLeggiFileTesto(args[0]); catch(ioexception ex) { System.out.println("Errore di I/O."); System.exit(1); stream di incapsulamento Le operazioni di I/O con cara8eri in genere coinvolgono tan9 cara8eri alla volta. In genere l unità di base per lavorare con i cara8eri è la LINEA: una stringa di cara8eri con un terminatore di linea alla fine (in win \r\n carriage- return/line- feed). Anche nel caso degli stream di cara8eri, possiamo u9lizzare gli stream di incapsulamento, che estendono le funzionalità dei Reader e Writer fornendo metodi idonei al tra8amento delle linee di testo. 16

stream di incapsulamento - INPUT BufferedReader le8ura bufferizzata Fornisce i metodi: readline() res9tuisce una stringa contenente il testo presente nella linea escluso il terminatore null se si raggiunge la fine dello stream read() (singolo cara8ere e array di cara8eri) Si incapsula FileReader dentro un BufferedReader FileReader BufferedReader stream di incapsulamento - OUTPUT PrintWriter scri8ura forma8ata Fornisce i metodi per scrivere i 9pi primi9vi e non, su uno stream di testo. Ad esempio: print(boolean b), print(double d), print(string s) O la loro versione con il terminatore: println(boolean b), println(double d), println(string s) Si incapsula FileWriter dentro un PrintWriter FileWriter PrintWriter 17

classe File La classe File fornisce l accesso a file e directory in modo indipendente dal sistema opera9vo. Me8e a disposizione una serie di metodi per o8enere informazioni su un certo file o directory, e per visualizzare e modificarne gli a8ribu9. A proposito di indipendenza Ogni sistema opera9vo u9lizza convenzioni diverse per separare le varie directory in un path. Esempio: in Linux /, in Windows \ ; Costru8ore: public File(String path) classe File metodi u>li () getname public String res9tuisce il nome dell ogge8o () getabsolutepath public String res9tuisce il percorso assoluto dell ogge8o () exist public boolean res9tuisce vero se l ogge8o File esiste () isdirectory public boolean res9tuisce vero se l oggeto File è una direcotry () length public long res9tuisce la lunghezza in byte dell ogge8o ( dest public boolean renameto(file rinomina l ogge8o () delete public boolean cancella l ogge8o File () mkdir public boolean crea una directory che corrisponde all ogge8o File () list public String[] res9tuisce un ve8ore contenente il nome di tu0 file della directory associata all ogge8o File 18

classe RandomAccessFile Consente l accesso in modo RANDOM (cioè non sequenziale) ai file. Consente l accesso ad un file contemporaneamente in scri8ura e il le8ura. Implementa le interfacce DataInput e DataOutput, rendendo possibile la scri8ura in file di tu0 gli ogge0 e i 9pi primi9vi. Costru8ori: public RandomAccessFile(String file, String mode) public RandomAccessFile(File file, String mode) Il parametro mode è di 9po String e specifica la modalità di accesso al file: "r" oppure "rw" Oltre ai metodi read/write, offre i metodi: long getfilepointer(), seek(long pos), skipbytes(int pos) serializzazione di oggef Serializzare un ogge@o significa salvare un ogge8o scrivendo una sua rappresentazione binaria su uno stream di byte Analogamente, deserializzare un ogge@o significa ricostruire un ogge8o a par9re dalla sua rappresentazione binaria le8a da uno stream di byte Le classi ObjectOutputStream e ObjectInputStream offrono questa funzionalità per qualunque 9po di ogge8o. 19

Le due classi principali sono: ObjectInputStream serializzazione di oggef legge oggef serializza9 salva9 su stream, tramite il metodo readobject() offre anche metodi per leggere i 9pi primi9vi di Java ObjectOutputStream scrive un ogge@o serializzato su stream, tramite il metodo writeobject() offre anche metodi per scrivere i 9pi primi9vi di Java serializzazione di oggef Una classe che voglia essere serializzabile deve implementare l interfaccia Serializable È una interfaccia vuota, che serve come marcatore (il compilatore rifiuta di compilare una classe che usa la serializzazione senza implementare tale interfaccia) Vengono scrif / lef tuf i da> non sta>c e non transient dell ogge@o, inclusi quelli eredita> (anche se priva9 o prote0) 20

serializzazione di oggef Se un ogge8o con>ene riferimen> ad altri oggef, si invoca ricorsivamente writeobject()su ognuno di essi si serializza quindi, in generale, un intero grafo di ogge0 l'opposto accade quando si deserializza Se uno stesso ogge8o è referenziato più volte nel grafo, viene serializzato una sola volta, affinché writeobject() non cada in una ricorsione infinita. esempio - serializzazione ESEMPIO di classe serializzabile public class PuntoCartesiano implements java.io.serializable { private int x; private int y; public PuntoCartesiano(int x, int y) { this.x = x; this.y = y; public PuntoCartesiano() { x = y = 0; public float getascissa() { return x; public float getordinata() { return y; 21

esempio - serializzazione import java.io.*; SCRITTURA SU FILE public class ScriviPunto { public ScriviPunto(String filename) throws IOException { PuntoCartesiano point = new PuntoCartesiano(3, 10); FileOutputStream fos = new FileOutputStream(filename); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(point); oos.flush(); oos.close(); esempio - serializzazione SCRITTURA SU FILE public static void main(string[] args) { try { ScriviPunto sp = new ScriviPunto(args[0]); catch(ioexception ex) { System.out.println("Errore di I/O."); System.exit(1); 22

esempio - serializzazione import java.io.*; LETTURA DA FILE public class LeggiPunto { public LeggiPunto(String filename) throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(filename); ObjectInputStream ois = new ObjectInputStream(fis); PuntoCartesiano point = (PuntoCartesiano)ois.readObject(); ois.close(); System.out.println("Punto (" + point.getascissa() + ", " + point.getordinata() + ")"); Il cast è necessario, perché readobject() restituisce un Object esempio - serializzazione LETTURA DA FILE public static void main(string[] args) { try { LeggiPunto lp = new LeggiPunto(args[0]); catch(ioexception ex) { System.out.println("Errore I/O: " + ex.getmessage()); System.exit(1); catch(classnotfoundexception ex) { System.out.println("Errore: " + ex.getmessage()); System.exit(2); 23