Jav@Lab Il linguaggio Java I file sequenziali



Documenti analoghi
Corso sul linguaggio Java

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

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

Input/Output in Java

20 - Input/Output su File

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

Architettura Client-Server

Introduzione. Java. Streams. Streams

Corso di Reti di Calcolatori L-A

Flussi, lettori e scrittori

Il sistema I/O di Java

Gestione dei File in C

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Parte II: Reti di calcolatori Lezione 10

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

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Algoritmi di Ricerca. Esempi di programmi Java

Programmare con le Socket TCP in java. 2: Application Layer 1

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

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

GESTIONE DEI PROCESSI

Architettura di un computer

Introduzione alla programmazione in C

Le variabili. Olga Scotti

Introduzione al Linguaggio C

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

Gestione di file in Java

Corso sul linguaggio Java

I file di dati. Unità didattica D1 1

Architettura di un calcolatore

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

Il SOFTWARE DI BASE (o SOFTWARE DI SISTEMA)

I Sistemi Informativi

Esercitazione n 4. Obiettivi

Il sistema operativo: interazione con l utente

La struttura dati ad albero binario

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Java: Compilatore e Interprete

Programmazione a Oggetti Lezione 10. Ereditarieta

Gestione del workflow

Programmazione 2. Input Output su Stream e File

Struttura di un programma Java

Il Sistema Operativo: il File System

Materiali per il modulo 1 ECDL. Autore: M. Lanino

Main System Monitor Keyboard

IL SISTEMA OPERATIVO IL SISTEMA OPERATIVO INTERFACCE TESTUALI INTERFACCE TESTUALI FUNZIONI DEL SISTEMA OPERATIVO INTERFACCE GRAFICHE

Strutturazione logica dei dati: i file

Il Personal Computer. Cos è Lo schema di massima Che cosa ci possiamo fare. 1

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

Esercitazioni aggiuntive Martedì Laboratorio L-12

Programmare con le Socket TCP

Il Software. Il software del PC. Il BIOS

Operazioni di scrittura e lettura con periferici in linguaggio Java

Pila di interi. Car 1. Car n. Pila di interi: Pila di Oggetti: Gli elementi che sono inseriti e tolti dalla pila sono numeri interi

Matlab: Gestione avanzata dei file

Il software impiegato su un computer si distingue in: Sistema Operativo Compilatori per produrre programmi

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Dispensa di Informatica I.1

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Organizzazione della memoria

Programmare con le Socket

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Corso di Informatica

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

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

Transcript:

Jav@Lab Il linguaggio Java I file sequenziali

Input e Output Secondo i canoni dei linguaggi di programmazione "procedurali" il concetto di input e output è strettamente legato al tipo di dispositivo esterno di da cui e verso cui i dati transitano (dischi, nastri, ecc.): quindi il file è visto come contenitore su supporto di memorizzazione di massa, la tastiera come dispositivo di standard input e il video o la stampante assimilati a standard output. La tendenza odierna è quella di separare nettamente i dispositivi di I/O dal trattamento dei flussi di dati da e verso di essi. Per questa ragione in Java si è fatta la scelta di introdurre "astrazioni" pensate come "oggetti" che sono indipendenti dai dispositivi. Tali oggetti sono o Stream, o Pipe o Filter e sono veri e propri Abstract Data Type dotati di operazioni che non dipendono dal particolare dispositivo di I/O. Gli Stream (Flussi) Il significato letterale della parola stream è "flusso". In informatica il flusso è un astrazione che definisce i metodi di lettura/scrittura delle unità di informazione accessibili. Tali informazioni vengono anche detti "token". Un "token", quindi, è una unità di informazione accessibile è può consistere in un byte, un carattere o un oggetto strutturato. Uno stream o flusso di dati o canale è un percorso di comunicazione tra la sorgente di una certa informazione e la sua destinazione. Le sorgenti possono essere le più svariate: o la memoria Ram del computer, o Internet, o un dispositivo permanente di memorizzazione dati, o la tastiera ecc. La stessa cosa vale per le destinazioni. La sorgente e la destinazione del flusso di byte sono anche denominati rispettivamente processo produttore e processo consumatore. Sorgente = Processo Produttore Destinazione = Processo Consumatore Sorgente Flusso di Input Metodo o Programma che legge i dati Metodo o Programma che scrive i dati Flusso di Output Destinazione

Non è necessario conoscere in dettaglio la sorgente o la destinazione per leggere un flusso di input o per scrivere in un flusso di output. I metodi generali (oppure i programmi) che operano su una sorgente di dati accettano come argomento un flusso di input, così quelli che scrivono su una destinazione accettano come argomento uno stream di output. I Filters (Filtri) Oltre ai metodi (o programmi) che fanno uso di stream di I/O esistono anche "oggetti" detti processori di dati. Un filter (filtro) o processore di dato è un metodo, o un programma, dotato di due argomenti di tipo flusso: legge dati dal flusso di input, li elabora (filtra, seleziona ecc.) e li scrive sul flusso di output. I filtri non necessitano di alcuna informazione, nè riguardo alla sorgente nè riguardo alla destinazione; i filtri richiedono soltanto le modalità di accesso (astratte) al rispettivo flusso. Un filtro può essere rappresentato dalla figura: Flusso di Input FILTRO o PROCESSORE Flusso di Output La separazione delle entità Queste astrazioni:. o o o o o o Sorgente o processo produttore dei dati; Flusso di input; Pipe o condotto; Filtro o processore; Flusso di output; Destinazione o processo Consumatore dei dati consentono di separare logicamente quelle entità, come File e dispositivi di memorizzazione, che nell informatica "classica" erano considerate legate in modo univoco. È il programmatore che decide quali relazioni costruire tra le diverse entità astratte e tra queste ultime e i dispositivi concreti. I Flussi di Input/Output Le informazioni memorizzate in un file, in ultima analisi sono sempre memorizzate come serie di byte. In java un oggetto dal quale è possibile leggere una sequenza di byte viene chiamato stream di input; un oggetto sul quale è possibile scrivere una sequenza di byte viene chiamato stream di output. Tali Stream vengono specificati nelle classi astratte InputStream e OutputStream. Tali gerarchie di classi sono presenti nel package java.io. Visto che i genitori sono classi astratte, i relativi metodi sono implementati solo nelle sottoclassi della gerarchia.

Gli schemi seguenti mostrano la gerarchia, anche se non completa, delle classi essenziali relative al trattamento dei flussi di input Accesso a carattere (2 byte) InputStream ByteArrayInputStream FileInputStream OutputStream ByteArrayOutputStream FileOutputStream Accesso a byte Reader CharArrayReader StringReader InputStreamReader FileReader BufferedReader Writer CharArrayWriter StringWriter OutputStreamWriter FileWriter BufferedWriter Riflettiamo. La classe astratta InputStream ha un metodo astratto read che legge un byte e restituisce il byte letto oppure 1 in caso di non lettura. La classe FileInputStream che discende da InputStream, ridefinisce il metodo read che consente tale operazione; tale metodo permette al massimo la lettura di un gruppo di byte, ma non consente la lettura di particolari tipi di variabili. E necessario allora usare le classi Filters che elaborano i gruppi di byte letti mettendo a disposizione metodi per la lettura/scrittura di variabili di tutti i tipi fondamentali di Java. L accesso sequenziale basato sul byte Le classi FileInputStream e FileOutputStream forniscono stream di Input e Output associati ad un file del disco. Per associare uno Stream di input ad un file occorre utilizzare il costruttore della classe FileInputStream nel seguente modo: FileInputStream f = new FileInputStream( elenco.dat ); Analogamente per associare uno Stream di output ad un file è necessario utilizzare il costruttore della classe FileOutputStream nel seguente modo: FileOutputStream f = new FileOutputStream( elenco.dat ); In entrambi i casi non specificando nessun path il file verrà cercato nella directory attiva. Queste due classi poiché discendono direttamente dalle classi astratte InputStream e OutputStream possono leggere e scrivere solo byte e array di byte.

E necessario che tali flussi vengano assemblati in tipi più utili. Tale assemblaggio viene fatto da oggetti Filter, come per esempio quelli istanziati dalla classe DataInputStream e DataOutputStream, nel seguente modo: Input Output FileInputStream f = new FileInputStream ( elenco.dat ); DataInputStream in = new DataInputStream(f); FileOutputStream f = new FileOutputStream ( elenco.dat,true DataOutputStream out = new DataOutputStream(f); Le classi DataInputStream e DataOutputStream contengono tutti I metodi per la lettura e la scrittura di tutti I tipi Java: DataInputStream readboolean readbyte readchar readdouble readfloat readfully readint readline readlong readshort readutf skip.bytes DataOutputStream writechars writebyte writeint writeshort writelong writefloat writedouble writechar writeboolean writeutf Gli stream non sono bufferizzati. Questo significa che ogni chiamata di lettura o scrittura contatta il S.O. per chiedere o inviare un altro byte. Se si desidera usare un buffer è necessario usare la seguente scrittura: Input FileInputStream f = new FileInputStream ( elenco.dat ); BufferedInputStream b = new BufferedInputStream(f); Output DataInputStream in = new DataInputStream(b); FileOutputStream f = new FileOutputStream ( elenco.dat,true); BufferedOutputStream b = new BufferedOutputStream (f) DataOutputStream out = new DataOutputStream(b); DataInputStream e DataOutputStream sono sempre messi in coda perche sono tali classi ad occuparsi del filtraggio dei bytes letti. Esempio: Scrivere un programma che permetta l archiviazione di libri e la visualizzazione dell intero elenco. Per prima cosa scriviamo la classe Clibro.

package myprojects.biblioteca; import java.io.*; class CLibro implements Serializable // Attributi della classe private String Autore = ""; private String Titolo = ""; private String Edizione = ""; private String CasaEditrice = ""; private String Costo = ""; private String Anno = ""; //Costruttore vuoto public CLibro() public CLibro(String Autore,String Titolo,String Edizione,String CasaEditrice,String Costo, String Anno) this.autore = Autore; this.titolo = Titolo; this.edizione = Edizione; this.casaeditrice = CasaEditrice; this.costo = Costo;

this.anno = Anno; public void AppendiRecord(String filelibri) try //Associo un Stream al File FileOutputStream f = new FileOutputStream(fileLibri,true); //Creo un buffer associato allo stream BufferedOutputStream b = new BufferedOutputStream(f); //Inserisco un oggetto Filter per la scrittura dei tipi dei singoli attributi DataOutputStream fout = new DataOutputStream(b); //Scrivo I singoli campi fout.writeutf(autore); fout.writeutf(titolo); fout.writeutf(edizione); fout.writeutf(casaeditrice); fout.writeutf(costo); fout.writeutf(anno); //Libero il buffer fout.flush(); //Chiudo lo stream f.close(); catch(exception e)

System.out.println("Problemi di scrittura"); public void VisualizzaFile(String filelibri) try // Apro uno stream di Input FileInputStream f = new FileInputStream(fileLibri); // Associo uno stream buffer BufferedInputStream b = new BufferedInputStream(f); // Inserisco un oggetto Filter per la lettura dei singoli attributi DataInputStream fin = new DataInputStream(b); while(true) try System.out.print(fIN.readUTF()+" "); System.out.print(fIN.readUTF()+" "); System.out.print(fIN.readUTF()+" "); System.out.print(fIN.readUTF()+" "); System.out.print(fIN.readUTF()+" "); System.out.print(fIN.readUTF()+"\n"); catch(eofexception e)

break; f.close(); catch(exception e) System.out.println("Problemi di lettura"); Dopo aver scritto la classe CLIbro, scriviamo la classe Cbiblioteca package myprojects.biblioteca; import java.io.*; class CBiblioteca implements Serializable public CBiblioteca() // Metodo per la lettura da tastiera private String leggiinput() InputStreamReader input = new InputStreamReader(System.in); BufferedReader tastiera = new BufferedReader(input);

String inputstr = ""; try inputstr = tastiera.readline(); catch(exception e) System.out.println("Errore di lettura"); return(inputstr); // Metodo InserisciLibro private void InserisciLibro() System.out.print("Autore :"); String Autore = leggiinput(); System.out.print("Titolo :"); String Titolo = leggiinput(); System.out.print("Edizione :"); String Edizione = leggiinput(); System.out.print("Casa Editrice :"); String CasaEditrice = leggiinput(); System.out.print("Costo :"); String Costo = leggiinput(); System.out.print("Anno :");

String Anno = leggiinput(); CLibro libro = new CLibro(Autore,Titolo,Edizione,CasaEditrice,Costo,Anno); libro.appendirecord("libri.txt"); public void VisualizzaLibri() CLibro libro = new CLibro(); libro.visualizzafile("libri.txt"); // Metodo Main public static void main(string args[]) throws Exception int scelta = 0; System.out.println("Starting Biblioteca..."); Biblioteca b = new Biblioteca(); do System.out.println("Menu Biblioteca"); System.out.println("1. Inserisci Libro"); System.out.println("2. Visualizza Libri"); System.out.println("3. Esci"); String sceltastr = b.leggiinput(); scelta = Integer.valueOf(sceltaStr).intValue();

switch(scelta) case 1 : b.inseriscilibro(); break; case 2 : b.visualizzalibri(); break; while (scelta!= 3);