Input-Output 16 Maggio 2006. Nei programmi sviluppati sino ad oggi abbiamo usato * output su schermo (con System.out.print e System.out.print ) * input.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

IL PACKAGE java.io Il package java.io definisce quattro
Accesso ai dati su file Lab. Sistemi Informativi Economico-Aziendali Accesso ai dati su file Localizzazione dei dati File system locali e distribuiti Protocolli.
© 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.
Stringhe di caratteri In linguaggio C.
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.
Programmazione Ingegneria TLC
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
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.
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Eccezioni Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
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.
1 Corso di Informatica (Programmazione) Lezione 7 (5 novembre 2008) Programmazione in Java: lessico, variabili, tipi primitivi, assegnamento a variabile.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: funzione di output a video Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Introduzione agli stream e alle classi
ingredienti fondamentali e tecniche di base
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.
Concetti di informatica e fondamenti di Java, 4 ed.Apogeo ©2007 Capitolo 11 Ingresso/uscita e gestione delle eccezioni Cay S. Horstmann Concetti di informatica.
Esercizio: Copiare un file in un nuovo file mediante le funzioni read e write.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
I File.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Programmazione in Java
Programmazione in Java Claudia Raibulet
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
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”
Conversione da base 10 a base X (Utilizzo della pila)
1 Applet ed HTML Fondamenti di Informatica Corso D.
Le eccezioni F. Bombi 01/11/ Errori e situazioni impreviste situazioni eccezionali In un programma situazioni eccezionali possono.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Astrazione procedurale ed eccezioni
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.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
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,
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
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.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
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.
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
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’
Input in Java. Uso Scanner Un oggetto per la lettura dalla tastiera Piuttosto, per rappresentare la tastiera del nostro calcolatore useremo un oggetto.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Files in C++ Motivazioni Un programma in esecuzione legge (sequenzialmente) una sequenza di caratteri prodotti "al volo" dall'utente (tramite tastiera)
Introduzione alle Classi e agli Oggetti in Java 1.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Input-Output 16 Maggio 2006

Nei programmi sviluppati sino ad oggi abbiamo usato * output su schermo (con System.out.print e System.out.print ) * input da tastiera (con la classe Input ) Se un programma deve leggere o scrivere grandi quantità di dati, è conveniente memorizzare questi dati in files. Java fornisce classi e metodi per scrivere e leggere dati da files (nel package java.io )

I dati possono essere memorizzati in un file in formato testo (sequenza di caratteri, leggibile da esseri umani) binario (sequenza di byte) Vedremo solo il primo caso (il secondo comunque e’ piu’ efficiente) Per esempio formato testo per il numero intero 12354, `1` `2``3``5``4` un carattere alla volta

Ricordiamo che Tipo Primitivo: char Contiene un solo carattere tra apici singoli ‘a’ carattere “a” stringa Il metodo charAt (int i) permette di leggere il carattere in posizione i di una stringa

Classi per I/O su files Input da fileOutput su file Formato testo FileReader FileWriter Formato binario FileInputStream FileOutputStream Queste classi gestiscono I/O di caratteri o bytes da files: per dati più complessi (stringhe, numeri) introdurremo altre classi. I file di testo possono essere aperti, esaminati e modificati usando normali editor (es. emacs).

Lettura di singoli caratteri da file Per leggere dati (un carattere alla volta) da un file, occorre: * ricordarsi di importare il pacchetto java.io ; import java.io.*; creare un oggetto della classe FileReader, passando il nome del file al costruttore; FileReader filein = new FileReader("dati.txt");

Per leggere utilizzare il metodo public int read() della classe FileReader per leggere i caratteri; int next = filein.read(); Il metodo read() restituisce un intero che può essere: -1 se si è arrivati alla fine del file; un intero che rappresenta il codice di un carattere UNICODE. Tipicamente, si controlla se il numero letto è diverso da -1 e in questo caso si trasforma l'intero in un char usando l'operatore di cast. char c = (char) next;

Attenzione I metodi e il costruttore di FileReader possono lanciare una eccezione di tipo IOException che rappresenta un errore di I/O. Queste eccezioni sono controllate, e quindi devono essere previste dal programmatore. Quando si termina di leggere o scrivere bisogna “chiudere” il file con il metodo public void close(). filein.close();

Esempio di lettura da file CopyRead.java : stampa su video del contenuto di un file (copyread.txt). Le eventuali IOException non vengono gestite dal programma ma rinviate al chiamante. Importante: Cosa succede se non dichiariamo che main può lanciare IOException ? Le eccezioni controllate devono essere riportate nell’intestazione del metodo tramite throws ?

import java.io.*; public class CopyRead { public static void main(String [] args) throws IOException { // apre il file in lettura FileReader filein = new FileReader("copyread.txt"); int next; char nextc; do { next = filein.read(); // legge il prossimo carattere if (next != -1) { // se non e' finito il file nextc = (char) next; System.out.print(nextc); // stampa il carattere } } while (next != -1); filein.close(); //chiude il file System.out.println(); }

Scrittura di caratteri su file Per scrivere dati su di un file, occorre: creare un oggetto della classe FileWriter, passando il nome del file al costruttore; * utilizzare il metodo public void write(int c) per scrivere i caratteri; * chiudere il file con il metodo close(). Anche questi metodi possono lanciare una IOException.

CopyWrite.java : scrive in un file ( copywrite.txt ) una stringa fornita dall'utente, un carattere alla volta. import java.io.*; public class CopyWrite { public static void main(String[] args) throws IOException { // apre il file copywrite.txt in scrittura FileWriter fileout = new FileWriter("copywrite.txt"); System.out.print("Scrivi una stringa: "); // legge una stringa da tastiera String str = Input.readLine(); // un ciclo scrive ogni carattere delle stringa nel file for (int i = 0; i < str.length(); i++) fileout.write(str.charAt(i)); fileout.close(); // chiude il file }

Le classi FileReader e FileWriter forniscono i metodi basici per leggere o scrivere caratteri su file. Non è conveniente usarle direttamente nei programmi perché: rendono un programma inefficiente, visto che ogni operazione di I/O ( read o write di singolo carattere) richiede un accesso al file; non permettono di leggere/scrivere direttamente dati più complessi come stringhe e numeri. Altre classi di Java forniscono funzionalità di I/O più avanzate, ne vedremo alcune

Altre classi di Java forniscono funzionalità di I/O più avanzate, in particolare BufferedReader e BufferedWriter usano un buffer (memoria tampone) per memorizzare temporaneamente i caratteri da leggere/scrivere, in modo da ridurre il numero di accessi al file; PrintWriter fornisce i metodi print e println, che permettono di scrivere qualunque dato Java, convertendolo automaticamente in stringa. Gli oggetti di queste classi sono dei wrappers: incapsulano gli oggetti delle classi FileReader e FileWriter estendendone le funzionalità.

Esempio Vogliamo scrivere direttamente in un file un numero, un oggetto (il suo stato interno), o una stringa FileWriter fileout = new FileWriter("copyprintwrite.t xt"); //... che incapsulo in un PrintWriter PrintWriter printout = new PrintWriter(fileout);

PrintWriter Ha metodi print e println per stampare numeri oggetti e stringhe Allo stesso tempo questi metodi convertono tutto in una stringa, la stringa viene poi scomposta in caratteri e mandata all’oggetto FileWriter corrispondente

FileWriter fileout = new FileWriter("copyprintwrite.txt"); //... che incapsulo in un PrintWriter PrintWriter printout = new PrintWriter(fileout); printout.println(115); //numero printout.println(“Hello”); //Una stringa printout.println(new Studente(“pippo”); //Un oggetto Nel caso dell’oggetto viene usato ToString(), alla fine nel file e’ memorizzata la Stringa un carattere alla volta

Conviene usare la classe BufferedReader fornisce il metodo readLine() che legge una riga (String) In pratica continua a leggere nel file di input dell’oggetto lettore relativo tramite read() fino a costruire una stringa Quando i dati sono terminati readLine() restituisce null non ha metodi per leggere, ad esempio, interi o double. Lettura di dati da file

import java.io.*; public class CopyBufferedRead { public static void main(String [] args) throws IOException { // incapsula in BufferedReader un file aperto in lettura BufferedReader filebuf = new BufferedReader(new FileReader("copyread.txt")); String nextStr; // legge una riga del file nextStr = filebuf.readLine(); while (nextStr != null){ System.out.println(nextStr); // visualizza la riga nextStr = filebuf.readLine(); // legge la prossima riga } filebuf.close(); // chiude il file } La differenza rispetto al programma visto prima e’ che legge stringhe, non caratteri

Primo esercizio Scrivere programma che copia il file "inp.txt" nel file "out.txt” un carattere alla volta Modificarlo in modo che legga una linea alla volta

Una soluzione import java.io.*; public class CopiaFile { public static void main(String [] args) throws IOException { // apre il file in lettura FileReader filein=new FileReader("inp.txt"); FileWriter fileout = new FileWriter("out.txt"); int next; char nextc; do { next = filein.read(); // legge il prossimo carattere if (next != -1) { // se non e' finito il file nextc = (char) next; System.out.print(nextc); // stampa il carattere fileout.write(nextc); } } while (next != -1); filein.close(); fileout.close(); //chiude il file System.out.println();}}

Secondo Esercizio Dato un file integers.txt che contiene una sequenza di interi uno per linea Scrivere un programma che calcola la somma degli interi contenuti nel file Si può convertire una stringa in un numero usando i metodi statici Integer.parseInt e Double.parseDouble.

public class SommaInteri { public static void main(String[] args){ String inputFileName = "./integers.txt"; String line = null; try { BufferedReader in = new BufferedReader(new FileReader(inputFileName)); line = in.readLine(); int somma =0; while(line!=null){ // se non e' possibile convertire la stringa line in intero // viene lanciata un'eccezione NumberFormatException // (catturata sotto con catch apposito) int numero = Integer.parseInt(line); somma += numero; line = in.readLine(); } in.close(); System.out.println(" la somma e' "+ somma); } catch(FileNotFoundException e) { System.out.println(inputFileName+" FileNotFound"); } catch(NumberFormatException e) { System.out.println(" linea non corretta: --> "+line+" <--"); } catch(IOException e) { System.out.println(" IOException "+e); }}}

Eccezioni Si possono verificare varie eccezioni FileNotFoundException se non si trova il file NumberFormaxception se la stringa letta nel file non si puo’ convertire in intero

Quindi Sarebbe meglio gestire le eccezioni invece che propagarle Modificare il programma SommaInteri in modo che quando si verifica un'eccezione venga comunque stampata la somma calcolata fino a quel momento. 2.Modificare il programma [ SommaInteri ] in modo che quando si verifica un'eccezione di tipo NumberFormatException dovuta ad una linea del file non convertibile in intero si scarti tale riga ma si prosegua con il calcolo della somma.

Esercizio Aggiuntivo Scrivere un programma CatFiles contenente il metodo statico public static void concat(String [] inFiles, String outFile) che concatena il contenuto dei files il cui nome è nell'array inFiles nel file il cui nome è outFile. Se una delle stringhe dell'array inFiles non corrisponde ad un file reale, la stringa viene ignorata e si passa alla prossima. Eventuali altre eccezioni di I/O devono essere catturate dal metodo, che in questo caso deve lanciare una IllegalArgumentException. Per testare il programma, scrivere una semplice classe TestCatFiles che nel main invoca il metodo in questione dopo aver chiesto i nomi dei file all'utente. Controllare che l'effetto sia quello desiderato.