![]() ![]() |
|
![]() ![]() |
Nei programmi sviluppati sino ad oggi abbiamo
usato
Java fornisce classi e metodi per scrivere e leggere dati da files (nel package java.io [locale, Medialab, Sun]). I dati possono essere memorizzati in un file in formato
Queste classi gestiscono I/O di caratteri o bytes da files: per dati più complessi (stringhe, numeri) introdurremo altre classi. Adesso esaminiamo I/O in formato testo, ma quello in formato binario è del tutto analogo. I file di testo possono essere aperti, esaminati e
modificati usando normali editor (es. emacs). Per visualizzarne il
contenuto potete anche usare il comando less della shell di Linux.
|
![]() ![]() |
|
![]() ![]() |
Per leggere dati (un carattere alla volta) da un file, occorre:
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. Il metodo read() restituisce un intero che può essere:
|
![]() ![]() |
|
![]() ![]() |
CopyRead.java: stampa su video del contenuto di un file il cui nome viene chiesto all'utente (ad esempio, copyread.txt). Le eventuali IOException vengono catturate e in tal caso viene stampato un messaggio di errore.
Alternativamente si poteva delegare la gestione delle IOException al chiamante, aggiungendo la clausola throws IOException nell'intestazione del metodo main. |
![]() ![]() |
|
![]() ![]() |
Per scrivere dati su di un file, occorre:
Si osservi che se si verifica un'eccezione mentre si
tenta di scrivere un carattere nel file, il metodo close() non viene eseguito:
in certe situazioni questo
potrebbe portare alla perdita dei dati scritti nel file.
|
![]() ![]() |
|
![]() ![]() |
Le classi FileReader e FileWriter
forniscono i metodi basici per leggere o scrivere caratteri su file. Non
è conveniente usarle direttamente nei programmi perché
non permettono di leggere/scrivere direttamente dati più complessi
come stringhe e numeri. Altre classi di Java forniscono funzionalità di I/O più avanzate, in particolare
|
![]() ![]() |
|
![]() ![]() |
CopyPrintWrite.java:
scrive alcuni dati in un file (copyprintwrite.txt).
Si noti come un oggetto FileWriter viene passato al costruttore di BufferedWriter, e a sua volta il nuovo oggetto viene passato al costruttore di PrintWriter.
|
![]() ![]() |
|
![]() ![]() |
La classe BufferedReader fornisce
il metodo readLine() che legge una stringa, ma non ha metodi
per leggere, ad esempio, interi o double.
CopyBufferedRead.java:
stampa su video il contenuto di un file (copyread.txt)
(si confronti con CopyRead.java)
Si può convertire una stringa in un numero usando i metodi statici Integer.parseInt e Double.parseDouble. Si veda come questi metodi sono usati nella classe Input, per realizzare i metodi readInt() e readDouble(). Nota: Integer.parseInt e Double.parseDouble possono generare eccezioni non controllate (di tipo NumberFormatException). |
|
![]() ![]() |
|
![]() ![]() |
Il programma
SommaInteriGoodExceptions.java,
stampa la somma di una sequenza di interi, contenuti uno per linea nel
file integers.txt, con
una ragionevole gestione delle eccezioni.
Due semplici esercizi:
|
![]() ![]() |
|
![]() ![]() |
Abbiamo visto che le IOException sono eccezioni
controllate, e quindi devono essere catturate o delegate al chiamante.
Vediamo alcuni programmi che copiano il contenuto
del file inp.txt nel file out.txt, ma che
gestiscono le eccezioni in modo via via più raffinato.
|